Henri Verbeet : wined3d: Introduce WINED3D_BIND_INDIRECT_BUFFER.

Alexandre Julliard julliard at winehq.org
Thu Dec 12 16:29:43 CST 2019


Module: wine
Branch: master
Commit: cf442832276b0368ad19c21c6ca784da9562eb6b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cf442832276b0368ad19c21c6ca784da9562eb6b

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Dec 12 21:21:04 2019 +0330

wined3d: Introduce WINED3D_BIND_INDIRECT_BUFFER.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 ed9ee13311..f2b950f357 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 22196809b6..1e8d86fede 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 d54f22f35c..36d07beb23 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 35248ce9fa..5da6aec4fb 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 453bee6256..d5fe1c239b 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 db88e11032..9cdf18633c 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




More information about the wine-cvs mailing list