New upstream version 21.0.2+dfsg1
This commit is contained in:
parent
1f1bbb3518
commit
baafb6325b
706 changed files with 49633 additions and 5044 deletions
|
|
@ -16,6 +16,7 @@
|
|||
******************************************************************************/
|
||||
|
||||
#include "d3d11-subsystem.hpp"
|
||||
#include <map>
|
||||
|
||||
static inline bool get_monitor(gs_device_t *device, int monitor_idx,
|
||||
IDXGIOutput **dxgiOutput)
|
||||
|
|
@ -55,7 +56,9 @@ void gs_duplicator::Start()
|
|||
gs_duplicator::gs_duplicator(gs_device_t *device_, int monitor_idx)
|
||||
: gs_obj (device_, gs_type::gs_duplicator),
|
||||
texture (nullptr),
|
||||
idx (monitor_idx)
|
||||
idx (monitor_idx),
|
||||
refs (1),
|
||||
updated (false)
|
||||
{
|
||||
Start();
|
||||
}
|
||||
|
|
@ -116,13 +119,30 @@ EXPORT bool device_get_duplicator_monitor_info(gs_device_t *device,
|
|||
return true;
|
||||
}
|
||||
|
||||
static std::map<int, gs_duplicator*> instances;
|
||||
|
||||
void reset_duplicators(void)
|
||||
{
|
||||
for (auto &pair : instances) {
|
||||
pair.second->updated = false;
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT gs_duplicator_t *device_duplicator_create(gs_device_t *device,
|
||||
int monitor_idx)
|
||||
{
|
||||
gs_duplicator *duplicator = nullptr;
|
||||
|
||||
auto it = instances.find(monitor_idx);
|
||||
if (it != instances.end()) {
|
||||
duplicator = it->second;
|
||||
duplicator->refs++;
|
||||
return duplicator;
|
||||
}
|
||||
|
||||
try {
|
||||
duplicator = new gs_duplicator(device, monitor_idx);
|
||||
instances[monitor_idx] = duplicator;
|
||||
|
||||
} catch (const char *error) {
|
||||
blog(LOG_DEBUG, "device_duplicator_create: %s",
|
||||
|
|
@ -140,7 +160,10 @@ EXPORT gs_duplicator_t *device_duplicator_create(gs_device_t *device,
|
|||
|
||||
EXPORT void gs_duplicator_destroy(gs_duplicator_t *duplicator)
|
||||
{
|
||||
delete duplicator;
|
||||
if (--duplicator->refs == 0) {
|
||||
instances.erase(duplicator->idx);
|
||||
delete duplicator;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void copy_texture(gs_duplicator_t *d, ID3D11Texture2D *tex)
|
||||
|
|
@ -171,6 +194,13 @@ EXPORT bool gs_duplicator_update_frame(gs_duplicator_t *d)
|
|||
ComPtr<IDXGIResource> res;
|
||||
HRESULT hr;
|
||||
|
||||
if (!d->duplicator) {
|
||||
return false;
|
||||
}
|
||||
if (d->updated) {
|
||||
return true;
|
||||
}
|
||||
|
||||
hr = d->duplicator->AcquireNextFrame(0, &info, res.Assign());
|
||||
if (hr == DXGI_ERROR_ACCESS_LOST) {
|
||||
return false;
|
||||
|
|
@ -195,6 +225,7 @@ EXPORT bool gs_duplicator_update_frame(gs_duplicator_t *d)
|
|||
|
||||
copy_texture(d, tex);
|
||||
d->duplicator->ReleaseFrame();
|
||||
d->updated = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ void gs_texture_2d::RebuildSharedTextureFallback()
|
|||
td.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
td.ArraySize = 1;
|
||||
td.SampleDesc.Count = 1;
|
||||
td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
|
||||
width = td.Width;
|
||||
height = td.Height;
|
||||
|
|
@ -304,7 +305,11 @@ try {
|
|||
((gs_pixel_shader*)obj)->Rebuild(dev);
|
||||
break;
|
||||
case gs_type::gs_duplicator:
|
||||
((gs_duplicator*)obj)->Start();
|
||||
try {
|
||||
((gs_duplicator*)obj)->Start();
|
||||
} catch (...) {
|
||||
((gs_duplicator*)obj)->Release();
|
||||
}
|
||||
break;
|
||||
case gs_type::gs_swap_chain:
|
||||
((gs_swap_chain*)obj)->Rebuild(dev);
|
||||
|
|
|
|||
|
|
@ -196,7 +196,9 @@ void gs_device::InitCompiler()
|
|||
ver--;
|
||||
}
|
||||
|
||||
throw "Could not find any D3DCompiler libraries";
|
||||
throw "Could not find any D3DCompiler libraries. Make sure you've "
|
||||
"installed the <a href=\"https://obsproject.com/go/dxwebsetup\">"
|
||||
"DirectX components</a> that OBS Studio requires.";
|
||||
}
|
||||
|
||||
void gs_device::InitFactory(uint32_t adapterIdx)
|
||||
|
|
@ -339,7 +341,10 @@ ID3D11BlendState *gs_device::AddBlendState()
|
|||
bd.RenderTarget[i].DestBlendAlpha =
|
||||
ConvertGSBlendType(blendState.destFactorA);
|
||||
bd.RenderTarget[i].RenderTargetWriteMask =
|
||||
D3D11_COLOR_WRITE_ENABLE_ALL;
|
||||
(blendState.redEnabled ? D3D11_COLOR_WRITE_ENABLE_RED : 0) |
|
||||
(blendState.greenEnabled ? D3D11_COLOR_WRITE_ENABLE_GREEN : 0) |
|
||||
(blendState.blueEnabled ? D3D11_COLOR_WRITE_ENABLE_BLUE : 0) |
|
||||
(blendState.alphaEnabled ? D3D11_COLOR_WRITE_ENABLE_ALPHA : 0) ;
|
||||
}
|
||||
|
||||
SavedBlendState savedState(blendState, bd);
|
||||
|
|
@ -1029,7 +1034,6 @@ void device_load_vertexshader(gs_device_t *device, gs_shader_t *vertshader)
|
|||
return;
|
||||
|
||||
gs_vertex_shader *vs = static_cast<gs_vertex_shader*>(vertshader);
|
||||
gs_vertex_buffer *curVB = device->curVertexBuffer;
|
||||
|
||||
if (vertshader) {
|
||||
if (vertshader->type != GS_SHADER_VERTEX) {
|
||||
|
|
@ -1452,9 +1456,12 @@ void device_present(gs_device_t *device)
|
|||
}
|
||||
}
|
||||
|
||||
extern "C" void reset_duplicators(void);
|
||||
|
||||
void device_flush(gs_device_t *device)
|
||||
{
|
||||
device->context->Flush();
|
||||
reset_duplicators();
|
||||
}
|
||||
|
||||
void device_set_cull_mode(gs_device_t *device, enum gs_cull_mode mode)
|
||||
|
|
@ -1933,36 +1940,53 @@ void gs_vertexbuffer_destroy(gs_vertbuffer_t *vertbuffer)
|
|||
delete vertbuffer;
|
||||
}
|
||||
|
||||
void gs_vertexbuffer_flush(gs_vertbuffer_t *vertbuffer)
|
||||
static inline void gs_vertexbuffer_flush_internal(gs_vertbuffer_t *vertbuffer,
|
||||
const gs_vb_data *data)
|
||||
{
|
||||
size_t num_tex = data->num_tex < vertbuffer->uvBuffers.size()
|
||||
? data->num_tex
|
||||
: vertbuffer->uvBuffers.size();
|
||||
|
||||
if (!vertbuffer->dynamic) {
|
||||
blog(LOG_ERROR, "gs_vertexbuffer_flush: vertex buffer is "
|
||||
"not dynamic");
|
||||
return;
|
||||
}
|
||||
|
||||
vertbuffer->FlushBuffer(vertbuffer->vertexBuffer,
|
||||
vertbuffer->vbd.data->points, sizeof(vec3));
|
||||
if (data->points)
|
||||
vertbuffer->FlushBuffer(vertbuffer->vertexBuffer,
|
||||
data->points, sizeof(vec3));
|
||||
|
||||
if (vertbuffer->normalBuffer)
|
||||
if (vertbuffer->normalBuffer && data->normals)
|
||||
vertbuffer->FlushBuffer(vertbuffer->normalBuffer,
|
||||
vertbuffer->vbd.data->normals, sizeof(vec3));
|
||||
data->normals, sizeof(vec3));
|
||||
|
||||
if (vertbuffer->tangentBuffer)
|
||||
if (vertbuffer->tangentBuffer && data->tangents)
|
||||
vertbuffer->FlushBuffer(vertbuffer->tangentBuffer,
|
||||
vertbuffer->vbd.data->tangents, sizeof(vec3));
|
||||
data->tangents, sizeof(vec3));
|
||||
|
||||
if (vertbuffer->colorBuffer)
|
||||
if (vertbuffer->colorBuffer && data->colors)
|
||||
vertbuffer->FlushBuffer(vertbuffer->colorBuffer,
|
||||
vertbuffer->vbd.data->colors, sizeof(uint32_t));
|
||||
data->colors, sizeof(uint32_t));
|
||||
|
||||
for (size_t i = 0; i < vertbuffer->uvBuffers.size(); i++) {
|
||||
gs_tvertarray &tv = vertbuffer->vbd.data->tvarray[i];
|
||||
for (size_t i = 0; i < num_tex; i++) {
|
||||
gs_tvertarray &tv = data->tvarray[i];
|
||||
vertbuffer->FlushBuffer(vertbuffer->uvBuffers[i],
|
||||
tv.array, tv.width*sizeof(float));
|
||||
}
|
||||
}
|
||||
|
||||
void gs_vertexbuffer_flush(gs_vertbuffer_t *vertbuffer)
|
||||
{
|
||||
gs_vertexbuffer_flush_internal(vertbuffer, vertbuffer->vbd.data);
|
||||
}
|
||||
|
||||
void gs_vertexbuffer_flush_direct(gs_vertbuffer_t *vertbuffer,
|
||||
const gs_vb_data *data)
|
||||
{
|
||||
gs_vertexbuffer_flush_internal(vertbuffer, data);
|
||||
}
|
||||
|
||||
struct gs_vb_data *gs_vertexbuffer_get_data(const gs_vertbuffer_t *vertbuffer)
|
||||
{
|
||||
return vertbuffer->vbd.data;
|
||||
|
|
@ -1974,7 +1998,8 @@ void gs_indexbuffer_destroy(gs_indexbuffer_t *indexbuffer)
|
|||
delete indexbuffer;
|
||||
}
|
||||
|
||||
void gs_indexbuffer_flush(gs_indexbuffer_t *indexbuffer)
|
||||
static inline void gs_indexbuffer_flush_internal(gs_indexbuffer_t *indexbuffer,
|
||||
const void *data)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
|
|
@ -1987,12 +2012,22 @@ void gs_indexbuffer_flush(gs_indexbuffer_t *indexbuffer)
|
|||
if (FAILED(hr))
|
||||
return;
|
||||
|
||||
memcpy(map.pData, indexbuffer->indices.data,
|
||||
indexbuffer->num * indexbuffer->indexSize);
|
||||
memcpy(map.pData, data, indexbuffer->num * indexbuffer->indexSize);
|
||||
|
||||
indexbuffer->device->context->Unmap(indexbuffer->indexBuffer, 0);
|
||||
}
|
||||
|
||||
void gs_indexbuffer_flush(gs_indexbuffer_t *indexbuffer)
|
||||
{
|
||||
gs_indexbuffer_flush_internal(indexbuffer, indexbuffer->indices.data);
|
||||
}
|
||||
|
||||
void gs_indexbuffer_flush_direct(gs_indexbuffer_t *indexbuffer,
|
||||
const void *data)
|
||||
{
|
||||
gs_indexbuffer_flush_internal(indexbuffer, data);
|
||||
}
|
||||
|
||||
void *gs_indexbuffer_get_data(const gs_indexbuffer_t *indexbuffer)
|
||||
{
|
||||
return indexbuffer->indices.data;
|
||||
|
|
|
|||
|
|
@ -561,6 +561,8 @@ struct gs_duplicator : gs_obj {
|
|||
ComPtr<IDXGIOutputDuplication> duplicator;
|
||||
gs_texture_2d *texture;
|
||||
int idx;
|
||||
long refs;
|
||||
bool updated;
|
||||
|
||||
void Start();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue