[PATCH 02/10] wined3d: Probe for compute shader limits.

Guillaume Charifi guillaume.charifi at sfr.fr
Sun Jan 29 07:43:33 CST 2017


Signed-off-by: Guillaume Charifi <guillaume.charifi at sfr.fr>
---
 dlls/wined3d/directx.c         | 7 +++++++
 dlls/wined3d/utils.c           | 6 ++++++
 dlls/wined3d/wined3d_private.h | 2 ++
 3 files changed, 15 insertions(+)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 037883c..9169942 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3345,6 +3345,7 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
     gl_info->limits.vertex_uniform_blocks = 0;
     gl_info->limits.geometry_uniform_blocks = 0;
     gl_info->limits.fragment_uniform_blocks = 0;
+    gl_info->limits.compute_uniform_blocks = 0;
     gl_info->limits.fragment_samplers = 1;
     gl_info->limits.vertex_samplers = 0;
     gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers;
@@ -3551,6 +3552,12 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
             TRACE("Max fragment uniform blocks: %u (%d).\n", gl_info->limits.fragment_uniform_blocks, gl_max);
         }
     }
+    if (gl_info->supported[ARB_COMPUTE_SHADER] && gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
+    {
+        gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_BLOCKS, &gl_max);
+        gl_info->limits.compute_uniform_blocks = min(gl_max, WINED3D_MAX_CBS);
+        TRACE("Max compute uniform blocks: %u (%d).\n", gl_info->limits.compute_uniform_blocks, gl_max);
+    }
     if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
     {
         gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &gl_max);
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index e9ee90a..951e7ee 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5924,6 +5924,12 @@ void wined3d_gl_limits_get_uniform_block_range(const struct wined3d_gl_limits *g
         return;
 
     *base += *count;
+    *count = gl_limits->compute_uniform_blocks;
+
+    if (shader_type == WINED3D_SHADER_TYPE_COMPUTE)
+        return;
+
+    *base += *count;
     *count = 0;
 
     ERR("Unhandled shader type %#x.\n", shader_type);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 2fe5668..708d215 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -179,6 +179,7 @@ static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup
 #define MAX_FRAGMENT_SAMPLERS       16
 #define MAX_VERTEX_SAMPLERS         4
 #define MAX_COMBINED_SAMPLERS       (MAX_FRAGMENT_SAMPLERS + MAX_VERTEX_SAMPLERS)
+#define MAX_COMPUTE_SAMPLERS        16
 #define MAX_ACTIVE_LIGHTS           8
 #define MAX_CLIP_DISTANCES          WINED3DMAXUSERCLIPPLANES
 #define MAX_CONSTANT_BUFFERS        15
@@ -2143,6 +2144,7 @@ struct wined3d_gl_limits
     unsigned int vertex_uniform_blocks;
     unsigned int geometry_uniform_blocks;
     unsigned int fragment_uniform_blocks;
+    unsigned int compute_uniform_blocks;
     UINT fragment_samplers;
     UINT vertex_samplers;
     UINT combined_samplers;
-- 
Guillaume Charifi <guillaume.charifi at sfr.fr>




More information about the wine-patches mailing list