[PATCH 5/7] wined3d: Implement buffer samplers.

Józef Kucia jkucia at codeweavers.com
Thu Mar 24 07:54:41 CDT 2016


Sampler types that forbid mipmaps (buffers, multisampled textures etc)
cannot be used with GLSL functions taking the "lod" parameter.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/glsl_shader.c | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 11f103e..5d87095 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -70,6 +70,7 @@ struct glsl_sample_function
     enum wined3d_data_type data_type;
     BOOL output_single_component;
     unsigned int offset_size;
+    BOOL accepts_lod;
 };
 
 enum heap_node_op
@@ -1802,6 +1803,10 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
         shadow_sampler = glsl_is_shadow_sampler(shader, ps_args, entry->resource_idx, entry->sampler_idx);
         switch (reg_maps->resource_info[entry->resource_idx].type)
         {
+            case WINED3D_SHADER_RESOURCE_BUFFER:
+                sampler_type = "samplerBuffer";
+                break;
+
             case WINED3D_SHADER_RESOURCE_TEXTURE_1D:
                 if (shadow_sampler)
                     sampler_type = "sampler1DShadow";
@@ -2673,16 +2678,16 @@ static void shader_glsl_get_sample_function(const struct wined3d_shader_context
     }
     resource_types[] =
     {
-        {0, 0, ""},     /* WINED3D_SHADER_RESOURCE_NONE */
-        {1, 0, ""},     /* WINED3D_SHADER_RESOURCE_BUFFER */
-        {1, 1, "1D"},   /* WINED3D_SHADER_RESOURCE_TEXTURE_1D */
-        {2, 2, "2D"},   /* WINED3D_SHADER_RESOURCE_TEXTURE_2D */
-        {2, 0, ""},     /* WINED3D_SHADER_RESOURCE_TEXTURE_2DMS */
-        {3, 3, "3D"},   /* WINED3D_SHADER_RESOURCE_TEXTURE_3D */
-        {3, 0, "Cube"}, /* WINED3D_SHADER_RESOURCE_TEXTURE_CUBE */
-        {2, 1, ""},     /* WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY */
-        {3, 2, ""},     /* WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY */
-        {3, 0, ""},     /* WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY */
+        {0, 0, ""},       /* WINED3D_SHADER_RESOURCE_NONE */
+        {1, 0, "Buffer"}, /* WINED3D_SHADER_RESOURCE_BUFFER */
+        {1, 1, "1D"},     /* WINED3D_SHADER_RESOURCE_TEXTURE_1D */
+        {2, 2, "2D"},     /* WINED3D_SHADER_RESOURCE_TEXTURE_2D */
+        {2, 0, ""},       /* WINED3D_SHADER_RESOURCE_TEXTURE_2DMS */
+        {3, 3, "3D"},     /* WINED3D_SHADER_RESOURCE_TEXTURE_3D */
+        {3, 0, "Cube"},   /* WINED3D_SHADER_RESOURCE_TEXTURE_CUBE */
+        {2, 1, ""},       /* WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY */
+        {3, 2, ""},       /* WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY */
+        {3, 0, ""},       /* WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY */
     };
     struct shader_glsl_ctx_priv *priv = ctx->backend_data;
     enum wined3d_shader_resource_type resource_type = ctx->reg_maps->resource_info[resource_idx].type;
@@ -2704,6 +2709,13 @@ static void shader_glsl_get_sample_function(const struct wined3d_shader_context
         resource_type = WINED3D_SHADER_RESOURCE_TEXTURE_2D;
     }
 
+    sample_function->accepts_lod = resource_type != WINED3D_SHADER_RESOURCE_BUFFER;
+    if (lod && !sample_function->accepts_lod)
+    {
+        ERR("LOD is not allowed for resource type %#x.\n", resource_type);
+        lod = FALSE;
+    }
+
     /* Note that there's no such thing as a projected cube texture. */
     if (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_CUBE)
         projected = FALSE;
@@ -2945,7 +2957,7 @@ static void PRINTF_ATTR(9, 10) shader_glsl_gen_sample_code(const struct wined3d_
     }
     if (dx && dy)
         shader_addline(ins->ctx->buffer, ", %s, %s", dx, dy);
-    else if (bias)
+    else if (sample_function->accepts_lod && bias)
         shader_addline(ins->ctx->buffer, ", %s", bias);
     if (sample_function->offset_size)
     {
-- 
2.4.10




More information about the wine-patches mailing list