[PATCH 09/11] wined3d: Allocate texture binding set for compute pipeline.

Józef Kucia jkucia at codeweavers.com
Wed Feb 22 06:19:34 CST 2017


It seems that a majority of OpenGL implementations allow to statically
partition texture bindings. For other implementations we are going to
invalidate graphics pipeline texture bindings when appplying compute
pipeline texture bindings, and vice versa.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/context.c         |  6 +++---
 dlls/wined3d/directx.c         | 10 ++++++++++
 dlls/wined3d/glsl_shader.c     |  2 +-
 dlls/wined3d/state.c           |  4 +---
 dlls/wined3d/wined3d_private.h |  8 +++++---
 5 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index d60248d..92c2819 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1713,7 +1713,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     /* Initialize the texture unit mapping to a 1:1 mapping */
     for (s = 0; s < MAX_COMBINED_SAMPLERS; ++s)
     {
-        if (s < gl_info->limits.combined_samplers)
+        if (s < gl_info->limits.graphics_samplers)
         {
             ret->tex_unit_map[s] = s;
             ret->rev_tex_unit_map[s] = s;
@@ -2962,7 +2962,7 @@ static void context_map_vsamplers(struct wined3d_context *context, BOOL ps, cons
             state->shader[WINED3D_SHADER_TYPE_VERTEX]->reg_maps.resource_info;
     const struct wined3d_shader_resource_info *ps_resource_info = NULL;
     const struct wined3d_gl_info *gl_info = context->gl_info;
-    int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1;
+    int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.graphics_samplers) - 1;
     int i;
 
     /* Note that we only care if a resource is used or not, not the
@@ -3012,7 +3012,7 @@ static void context_update_tex_unit_map(struct wined3d_context *context, const s
      * When the mapping of a stage is changed, sampler and ALL texture stage
      * states have to be reset. */
 
-    if (gl_info->limits.combined_samplers >= MAX_COMBINED_SAMPLERS)
+    if (gl_info->limits.graphics_samplers >= MAX_COMBINED_SAMPLERS)
         return;
 
     if (ps)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8342325..5b1605d 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3352,7 +3352,9 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         gl_info->limits.uniform_blocks[i] = 0;
     gl_info->limits.fragment_samplers = 1;
     gl_info->limits.vertex_samplers = 0;
+    gl_info->limits.compute_samplers = 0;
     gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers;
+    gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers;
     gl_info->limits.vertex_attribs = 16;
     gl_info->limits.texture_buffer_offset_alignment = 1;
     gl_info->limits.glsl_vs_float_constants = 0;
@@ -3471,6 +3473,7 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         TRACE("Max vertex samplers: %u.\n", gl_info->limits.vertex_samplers);
         TRACE("Max combined samplers: %u.\n", gl_info->limits.combined_samplers);
         TRACE("Max vertex attributes: %u.\n", gl_info->limits.vertex_attribs);
+        gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers;
     }
     if (gl_info->supported[ARB_VERTEX_BLEND])
     {
@@ -3570,6 +3573,13 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_COMPUTE] = min(gl_max, WINED3D_MAX_CBS);
         TRACE("Max compute uniform blocks: %u (%d).\n",
                 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_COMPUTE], gl_max);
+        gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, &gl_max);
+        gl_info->limits.compute_samplers = gl_max;
+        TRACE("Max compute samplers: %u.\n", gl_info->limits.compute_samplers);
+        /* A majority of OpenGL implementations allow to statically partition
+         * the set of texture bindings into six separate sets. */
+        if (gl_info->limits.combined_samplers >= MAX_COMBINED_SAMPLERS + gl_info->limits.compute_samplers)
+            gl_info->limits.graphics_samplers -= gl_info->limits.compute_samplers;
     }
     if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
     {
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 41adac1..a8f7f86 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -592,7 +592,7 @@ static void shader_glsl_load_samplers(const struct wined3d_gl_info *gl_info,
                 continue;
 
             mapped_unit = tex_unit_map[sampler_info[i].base_idx + j];
-            if (mapped_unit == WINED3D_UNMAPPED_STAGE || mapped_unit >= gl_info->limits.combined_samplers)
+            if (mapped_unit == WINED3D_UNMAPPED_STAGE || mapped_unit >= gl_info->limits.graphics_samplers)
             {
                 ERR("Trying to load sampler %s on unsupported unit %u.\n", sampler_name->buffer, mapped_unit);
                 continue;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index ff79c7a..b73f4a8 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3604,10 +3604,8 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state
         return;
     }
 
-    if (mapped_stage >= gl_info->limits.combined_samplers)
-    {
+    if (mapped_stage >= gl_info->limits.graphics_samplers)
         return;
-    }
     context_active_texture(context, gl_info, mapped_stage);
 
     if (state->textures[sampler_idx])
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8b88931..1bcb482 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2202,9 +2202,11 @@ struct wined3d_gl_limits
     UINT textures;
     UINT texture_coords;
     unsigned int uniform_blocks[WINED3D_SHADER_TYPE_COUNT];
-    UINT fragment_samplers;
-    UINT vertex_samplers;
-    UINT combined_samplers;
+    unsigned int fragment_samplers;
+    unsigned int vertex_samplers;
+    unsigned int compute_samplers;
+    unsigned int graphics_samplers;
+    unsigned int combined_samplers;
     UINT general_combiners;
     UINT user_clip_distances;
     UINT texture_size;
-- 
2.10.2




More information about the wine-patches mailing list