[v2 2/4] wined3d: Support buffer sampler in shaders.

Andrew Wesie awesie at gmail.com
Sun Nov 20 11:16:30 CST 2016


Signed-off-by: Andrew Wesie <awesie at gmail.com>
---
 dlls/wined3d/glsl_shader.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 9e9c83b..b8fc2a4 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1985,6 +1985,12 @@ 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:
+                if (shadow_sampler)
+                    FIXME("Unsupported Buffer shadow sampler.\n");
+                sampler_type = "samplerBuffer";
+                break;
+
             case WINED3D_SHADER_RESOURCE_TEXTURE_1D:
                 if (shadow_sampler)
                     sampler_type = "sampler1DShadow";
@@ -2912,7 +2918,7 @@ static void shader_glsl_get_sample_function(const struct wined3d_shader_context
     resource_types[] =
     {
         {0, ""},        /* WINED3D_SHADER_RESOURCE_NONE */
-        {1, ""},        /* WINED3D_SHADER_RESOURCE_BUFFER */
+        {1, "Buffer"},  /* WINED3D_SHADER_RESOURCE_BUFFER */
         {1, "1D"},      /* WINED3D_SHADER_RESOURCE_TEXTURE_1D */
         {2, "2D"},      /* WINED3D_SHADER_RESOURCE_TEXTURE_2D */
         {2, ""},        /* WINED3D_SHADER_RESOURCE_TEXTURE_2DMS */
@@ -2978,7 +2984,10 @@ static void shader_glsl_get_sample_function(const struct wined3d_shader_context
             ERR("Unexpected flags %#x for texelFetch.\n", flags & ~texel_fetch_flags);
 
         base = "texelFetch";
-        type_part = "";
+        if (resource_type == WINED3D_SHADER_RESOURCE_BUFFER)
+            type_part = "Buffer";
+        else
+            type_part = "";
     }
 
     sample_function->name = string_buffer_get(priv->string_buffers);
@@ -4732,10 +4741,20 @@ static void shader_glsl_ld(const struct wined3d_shader_instruction *ins)
 
     shader_glsl_get_sample_function(ins->ctx, resource_idx, sampler_idx, flags, &sample_function);
     shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
-    shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param);
-    sampler_bind_idx = shader_glsl_find_sampler(&ins->ctx->reg_maps->sampler_map, resource_idx, sampler_idx);
-    shader_glsl_gen_sample_code(ins, sampler_bind_idx, &sample_function, ins->src[1].swizzle,
-            NULL, NULL, lod_param.param_str, &ins->texel_offset, "%s", coord_param.param_str);
+    if (ins->ctx->reg_maps->resource_info[resource_idx].type == WINED3D_SHADER_RESOURCE_BUFFER)
+    {
+        /* texelFetchBuffer does not have a lod argument */
+        sampler_bind_idx = shader_glsl_find_sampler(&ins->ctx->reg_maps->sampler_map, resource_idx, sampler_idx);
+        shader_glsl_gen_sample_code(ins, sampler_bind_idx, &sample_function, ins->src[1].swizzle,
+                NULL, NULL, NULL, &ins->texel_offset, "%s", coord_param.param_str);
+    }
+    else
+    {
+        shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param);
+        sampler_bind_idx = shader_glsl_find_sampler(&ins->ctx->reg_maps->sampler_map, resource_idx, sampler_idx);
+        shader_glsl_gen_sample_code(ins, sampler_bind_idx, &sample_function, ins->src[1].swizzle,
+                NULL, NULL, lod_param.param_str, &ins->texel_offset, "%s", coord_param.param_str);
+    }
     shader_glsl_release_sample_function(ins->ctx, &sample_function);
 }
 
-- 
2.7.4




More information about the wine-patches mailing list