[PATCH 6/8] wined3d: Store GL sampler limits as array.

Józef Kucia jkucia at codeweavers.com
Thu Mar 9 03:03:08 CST 2017


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/arb_program_shader.c |  2 +-
 dlls/wined3d/directx.c            | 58 +++++++++++++++++++++------------------
 dlls/wined3d/glsl_shader.c        |  2 +-
 dlls/wined3d/state.c              |  2 +-
 dlls/wined3d/utils.c              | 26 +++++++-----------
 dlls/wined3d/wined3d_private.h    |  5 +---
 6 files changed, 45 insertions(+), 50 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 150342b..6433b24 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -5793,7 +5793,7 @@ static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen
     /* TODO: Implement WINED3DTEXOPCAPS_PREMODULATE */
 
     caps->MaxTextureBlendStages   = MAX_TEXTURES;
-    caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, MAX_TEXTURES);
+    caps->MaxSimultaneousTextures = min(gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL], MAX_TEXTURES);
 }
 
 static DWORD arbfp_get_emul_mask(const struct wined3d_gl_info *gl_info)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8ef1401..1399fe1 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3402,12 +3402,12 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
     gl_info->limits.textures = 0;
     gl_info->limits.texture_coords = 0;
     for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i)
+    {
         gl_info->limits.uniform_blocks[i] = 0;
-    gl_info->limits.fragment_samplers = 1;
-    gl_info->limits.vertex_samplers = 0;
-    gl_info->limits.geometry_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.samplers[i] = 0;
+    }
+    gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = 1;
+    gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL];
     gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers;
     gl_info->limits.vertex_attribs = 16;
     gl_info->limits.texture_buffer_offset_alignment = 1;
@@ -3487,18 +3487,20 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         if (gl_info->supported[ARB_FRAGMENT_PROGRAM] || gl_info->supported[ARB_FRAGMENT_SHADER])
         {
             gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &gl_max);
-            gl_info->limits.fragment_samplers = gl_max;
+            gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_max;
         }
         else
         {
-            gl_info->limits.fragment_samplers = gl_info->limits.textures;
+            gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_info->limits.textures;
         }
-        TRACE("Max fragment samplers: %d.\n", gl_info->limits.fragment_samplers);
+        TRACE("Max fragment samplers: %d.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL]);
 
         if (gl_info->supported[ARB_VERTEX_SHADER])
         {
+            unsigned int vertex_sampler_count;
+
             gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &gl_max);
-            gl_info->limits.vertex_samplers = gl_max;
+            vertex_sampler_count = gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = gl_max;
             gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &gl_max);
             gl_info->limits.combined_samplers = gl_max;
             gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &gl_max);
@@ -3518,23 +3520,24 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
              *
              * So this is just a check to check that our assumption holds true. If not, write a warning
              * and reduce the number of vertex samplers or probably disable vertex texture fetch. */
-            if (gl_info->limits.vertex_samplers && gl_info->limits.combined_samplers < 12
-                    && MAX_TEXTURES + gl_info->limits.vertex_samplers > gl_info->limits.combined_samplers)
+            if (vertex_sampler_count && gl_info->limits.combined_samplers < 12
+                    && MAX_TEXTURES + vertex_sampler_count > gl_info->limits.combined_samplers)
             {
                 FIXME("OpenGL implementation supports %u vertex samplers and %u total samplers.\n",
-                        gl_info->limits.vertex_samplers, gl_info->limits.combined_samplers);
+                        vertex_sampler_count, gl_info->limits.combined_samplers);
                 FIXME("Expected vertex samplers + MAX_TEXTURES(=8) > combined_samplers.\n");
                 if (gl_info->limits.combined_samplers > MAX_TEXTURES)
-                    gl_info->limits.vertex_samplers = gl_info->limits.combined_samplers - MAX_TEXTURES;
+                    vertex_sampler_count = gl_info->limits.combined_samplers - MAX_TEXTURES;
                 else
-                    gl_info->limits.vertex_samplers = 0;
+                    vertex_sampler_count = 0;
+                gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = vertex_sampler_count;
             }
         }
         else
         {
-            gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers;
+            gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL];
         }
-        TRACE("Max vertex samplers: %u.\n", gl_info->limits.vertex_samplers);
+        TRACE("Max vertex samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX]);
         TRACE("Max combined samplers: %u.\n", gl_info->limits.combined_samplers);
         TRACE("Max vertex attributes: %u.\n", gl_info->limits.vertex_attribs);
     }
@@ -3619,8 +3622,8 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         TRACE("Max geometry uniform blocks: %u (%d).\n",
                 gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_GEOMETRY], gl_max);
         gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, &gl_max);
-        gl_info->limits.geometry_samplers = gl_max;
-        TRACE("Max geometry samplers: %u.\n", gl_info->limits.geometry_samplers);
+        gl_info->limits.samplers[WINED3D_SHADER_TYPE_GEOMETRY] = gl_max;
+        TRACE("Max geometry samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_GEOMETRY]);
     }
     if (gl_info->supported[ARB_FRAGMENT_SHADER])
     {
@@ -3646,8 +3649,8 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         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);
+        gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE] = gl_max;
+        TRACE("Max compute samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE]);
     }
     if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT])
     {
@@ -3692,8 +3695,9 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         gl_info->limits.samples = gl_max;
     }
 
-    sampler_count = gl_info->limits.vertex_samplers + gl_info->limits.fragment_samplers
-            + gl_info->limits.geometry_samplers;
+    sampler_count = 0;
+    for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
+        sampler_count += gl_info->limits.samplers[i];
     if (gl_info->supported[WINED3D_GL_VERSION_3_2] && gl_info->limits.combined_samplers < sampler_count)
     {
         /* The minimum value for GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS in OpenGL
@@ -3701,16 +3705,16 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
          * the minimum value is increased to 80. */
         WARN("Graphics pipeline sampler count %u is greater than combined sampler count %u.\n",
                 sampler_count, gl_info->limits.combined_samplers);
-        gl_info->limits.fragment_samplers = min(16, gl_info->limits.fragment_samplers);
-        gl_info->limits.vertex_samplers = min(16, gl_info->limits.vertex_samplers);
-        gl_info->limits.geometry_samplers = min(16, gl_info->limits.geometry_samplers);
+        for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
+            gl_info->limits.samplers[i] = min(gl_info->limits.samplers[i], 16);
     }
 
     /* A majority of OpenGL implementations allow to statically partition
      * the set of texture bindings into six separate sets. */
     gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers;
-    if (gl_info->limits.combined_samplers >= sampler_count + gl_info->limits.compute_samplers)
-        gl_info->limits.graphics_samplers -= gl_info->limits.compute_samplers;
+    sampler_count += gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE];
+    if (gl_info->limits.combined_samplers >= sampler_count)
+        gl_info->limits.graphics_samplers -= gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE];
 }
 
 /* Context activation is done by the caller. */
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index dcc1c31..4004bca 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -10405,7 +10405,7 @@ static void glsl_fragment_pipe_get_caps(const struct wined3d_gl_info *gl_info, s
             | WINED3DTEXOPCAPS_BUMPENVMAP
             | WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE;
     caps->MaxTextureBlendStages = MAX_TEXTURES;
-    caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, MAX_TEXTURES);
+    caps->MaxSimultaneousTextures = min(gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL], MAX_TEXTURES);
 }
 
 static DWORD glsl_fragment_pipe_get_emul_mask(const struct wined3d_gl_info *gl_info)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 461b52e..49ff9dc 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3323,7 +3323,7 @@ static void tex_coordindex(struct wined3d_context *context, const struct wined3d
         return;
     }
 
-    if (mapped_stage >= min(gl_info->limits.fragment_samplers, MAX_FRAGMENT_SAMPLERS))
+    if (mapped_stage >= min(gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL], MAX_FRAGMENT_SAMPLERS))
     {
         WARN("stage %u not mapped to a valid texture unit (%u)\n", stage, mapped_stage);
         return;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index d9d6f87..14f3478 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -2759,7 +2759,7 @@ static void query_internal_format(struct wined3d_adapter *adapter,
     }
     else
     {
-        if (!gl_info->limits.vertex_samplers)
+        if (!gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX])
             format_clear_flag(format, WINED3DFMT_FLAG_VTF);
 
         if (!(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING))
@@ -6033,26 +6033,20 @@ void context_get_texture_unit_range(const struct wined3d_context *context,
             *base = 0;
         else
             *base = gl_limits->graphics_samplers - 1;
-        *count = gl_limits->compute_samplers;
+        *count = gl_limits->samplers[WINED3D_SHADER_TYPE_COMPUTE];
         return;
     }
 
     *base = 0;
-    *count = gl_limits->fragment_samplers;
-    if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
-        return;
-
-    *base += *count;
-    *count = gl_limits->vertex_samplers;
-    if (shader_type == WINED3D_SHADER_TYPE_VERTEX)
-        return;
-
-    *base += *count;
-    *count = gl_limits->geometry_samplers;
-    if (shader_type == WINED3D_SHADER_TYPE_GEOMETRY)
-        return;
+    for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
+    {
+        *count = gl_limits->samplers[i];
+        if (i == shader_type)
+            return;
+        *base += *count;
+    }
 
-    *base += *count;
+    ERR("Unrecognized shader type %#x.\n", shader_type);
     *count = 0;
 }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 5bfdef7..3c8f977 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2261,10 +2261,7 @@ struct wined3d_gl_limits
     UINT textures;
     UINT texture_coords;
     unsigned int uniform_blocks[WINED3D_SHADER_TYPE_COUNT];
-    unsigned int fragment_samplers;
-    unsigned int vertex_samplers;
-    unsigned int geometry_samplers;
-    unsigned int compute_samplers;
+    unsigned int samplers[WINED3D_SHADER_TYPE_COUNT];
     unsigned int graphics_samplers;
     unsigned int combined_samplers;
     UINT general_combiners;
-- 
2.10.2




More information about the wine-patches mailing list