From: Henri Verbeet Subject: [PATCH 4/5] wined3d: Introduce WINED3D_BIND_INDIRECT_BUFFER. Message-Id: <20191212173305.17086-4-hverbeet@codeweavers.com> Date: Thu, 12 Dec 2019 21:03:04 +0330 Signed-off-by: Henri Verbeet --- dlls/d3d11/buffer.c | 2 +- dlls/d3d11/d3d11_private.h | 25 ++++++++++++++++++++++--- dlls/d3d11/texture.c | 6 +++--- dlls/wined3d/buffer.c | 4 ++++ dlls/wined3d/utils.c | 1 + include/wine/wined3d.h | 1 + 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c index ed9ee133118..f2b950f357f 100644 --- a/dlls/d3d11/buffer.c +++ b/dlls/d3d11/buffer.c @@ -448,7 +448,7 @@ static HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *dev wined3d_desc.byte_width = buffer->desc.ByteWidth; wined3d_desc.usage = wined3d_usage_from_d3d11(buffer->desc.Usage); - wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(buffer->desc.BindFlags); + wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(buffer->desc.BindFlags, buffer->desc.MiscFlags); wined3d_desc.access = wined3d_access_from_d3d11(buffer->desc.Usage, buffer->desc.CPUAccessFlags); wined3d_desc.misc_flags = buffer->desc.MiscFlags; wined3d_desc.structure_byte_stride = buffer->desc.StructureByteStride; diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index 22196809b64..1e8d86fede0 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -92,14 +92,33 @@ HRESULT d3d_set_private_data(struct wined3d_private_store *store, HRESULT d3d_set_private_data_interface(struct wined3d_private_store *store, REFGUID guid, const IUnknown *object) DECLSPEC_HIDDEN; -static inline unsigned int wined3d_bind_flags_from_d3d11(UINT bind_flags) +static inline unsigned int wined3d_bind_flags_from_d3d11(UINT bind_flags, UINT misc_flags) { - return bind_flags; + unsigned int wined3d_flags = bind_flags & (D3D11_BIND_VERTEX_BUFFER + | D3D11_BIND_INDEX_BUFFER + | D3D11_BIND_CONSTANT_BUFFER + | D3D11_BIND_SHADER_RESOURCE + | D3D11_BIND_STREAM_OUTPUT + | D3D11_BIND_RENDER_TARGET + | D3D11_BIND_DEPTH_STENCIL + | D3D11_BIND_UNORDERED_ACCESS); + + if (misc_flags & D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS) + wined3d_flags |= WINED3D_BIND_INDIRECT_BUFFER; + + return wined3d_flags; } static inline UINT d3d11_bind_flags_from_wined3d(unsigned int bind_flags) { - return bind_flags; + return bind_flags & (WINED3D_BIND_VERTEX_BUFFER + | WINED3D_BIND_INDEX_BUFFER + | WINED3D_BIND_CONSTANT_BUFFER + | WINED3D_BIND_SHADER_RESOURCE + | WINED3D_BIND_STREAM_OUTPUT + | WINED3D_BIND_RENDER_TARGET + | WINED3D_BIND_DEPTH_STENCIL + | WINED3D_BIND_UNORDERED_ACCESS); } /* ID3D11Texture1D, ID3D10Texture1D */ diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index d54f22f35c9..36d07beb23d 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -454,7 +454,7 @@ HRESULT d3d_texture1d_create(struct d3d_device *device, const D3D11_TEXTURE1D_DE wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE; wined3d_desc.multisample_quality = 0; wined3d_desc.usage = wined3d_usage_from_d3d11(desc->Usage); - wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags); + wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags, desc->MiscFlags); wined3d_desc.access = wined3d_access_from_d3d11(desc->Usage, desc->Usage == D3D11_USAGE_DEFAULT ? 0 : desc->CPUAccessFlags); wined3d_desc.width = desc->Width; @@ -1008,7 +1008,7 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE wined3d_desc.multisample_type = desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3D_MULTISAMPLE_NONE; wined3d_desc.multisample_quality = desc->SampleDesc.Quality; wined3d_desc.usage = wined3d_usage_from_d3d11(desc->Usage); - wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags); + wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags, desc->MiscFlags); wined3d_desc.access = wined3d_access_from_d3d11(desc->Usage, desc->Usage == D3D11_USAGE_DEFAULT ? 0 : desc->CPUAccessFlags); wined3d_desc.width = desc->Width; @@ -1467,7 +1467,7 @@ static HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_devi wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE; wined3d_desc.multisample_quality = 0; wined3d_desc.usage = wined3d_usage_from_d3d11(desc->Usage); - wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags); + wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags, desc->MiscFlags); wined3d_desc.access = wined3d_access_from_d3d11(desc->Usage, desc->Usage == D3D11_USAGE_DEFAULT ? 0 : desc->CPUAccessFlags); wined3d_desc.width = desc->Width; diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 35248ce9fa5..5da6aec4fb8 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -1300,6 +1300,10 @@ GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *g if (bind_flags & WINED3D_BIND_STREAM_OUTPUT) return GL_TRANSFORM_FEEDBACK_BUFFER; + if (bind_flags & WINED3D_BIND_INDIRECT_BUFFER + && gl_info->supported[ARB_DRAW_INDIRECT]) + return GL_DRAW_INDIRECT_BUFFER; + if (bind_flags & ~(WINED3D_BIND_VERTEX_BUFFER | WINED3D_BIND_INDEX_BUFFER)) FIXME("Unhandled bind flags %#x.\n", bind_flags); diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 453bee62565..d5fe1c239bf 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -4687,6 +4687,7 @@ const char *wined3d_debug_bind_flags(DWORD bind_flags) BIND_FLAG_TO_STR(WINED3D_BIND_RENDER_TARGET); BIND_FLAG_TO_STR(WINED3D_BIND_DEPTH_STENCIL); BIND_FLAG_TO_STR(WINED3D_BIND_UNORDERED_ACCESS); + BIND_FLAG_TO_STR(WINED3D_BIND_INDIRECT_BUFFER); #undef BIND_FLAG_TO_STR if (bind_flags) FIXME("Unrecognised bind flag(s) %#x.\n", bind_flags); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index db88e110327..9cdf18633c7 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -914,6 +914,7 @@ enum wined3d_shader_type #define WINED3D_BIND_RENDER_TARGET 0x00000020 #define WINED3D_BIND_DEPTH_STENCIL 0x00000040 #define WINED3D_BIND_UNORDERED_ACCESS 0x00000080 +#define WINED3D_BIND_INDIRECT_BUFFER 0x00000100 #define WINED3DUSAGE_SOFTWAREPROCESSING 0x00000010 #define WINED3DUSAGE_DONOTCLIP 0x00000020 -- 2.11.0