[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