[PATCH 2/2] wined3d: Store ps 1.4 texture types in ps_compile_args
Stefan Dösinger
stefan at codeweavers.com
Thu Apr 11 04:32:55 CDT 2013
---
dlls/wined3d/arb_program_shader.c | 2 +-
dlls/wined3d/glsl_shader.c | 3 +-
dlls/wined3d/shader.c | 58 +++++++++++++++++++++++++--------------
dlls/wined3d/wined3d_private.h | 16 +++++++++--
4 files changed, 53 insertions(+), 26 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index f540332..96e6348 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -4346,7 +4346,7 @@ static struct arb_ps_compiled_shader *find_arb_pshader(struct wined3d_shader *sh
shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
- pixelshader_update_samplers(&shader->reg_maps, device->stateBlock->state.textures);
+ pixelshader_update_samplers(&shader->reg_maps, args->super.tex_types);
if (!shader_buffer_init(&buffer))
{
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index a56f579..8560e0e 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -4626,7 +4626,6 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
struct wined3d_shader_buffer *buffer, struct wined3d_shader *shader,
const struct ps_compile_args *args, const struct ps_np2fixup_info **np2fixup_info)
{
- struct wined3d_state *state = &shader->device->stateBlock->state;
struct glsl_ps_compiled_shader *gl_shaders, *new_array;
struct glsl_shader_private *shader_data;
struct ps_np2fixup_info *np2fixup;
@@ -4689,7 +4688,7 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
memset(np2fixup, 0, sizeof(*np2fixup));
*np2fixup_info = args->np2_fixup ? np2fixup : NULL;
- pixelshader_update_samplers(&shader->reg_maps, state->textures);
+ pixelshader_update_samplers(&shader->reg_maps, args->tex_types);
shader_buffer_clear(buffer);
ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup);
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 692e5b2..9a389cb 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2062,6 +2062,36 @@ void find_ps_compile_args(const struct wined3d_state *state,
}
}
}
+ if (shader->reg_maps.shader_version.major == 1
+ && shader->reg_maps.shader_version.minor <= 4)
+ {
+ for (i = 0; i < 6; ++i)
+ {
+ const struct wined3d_texture *texture = state->textures[i];
+
+ /* Treat unbound textures as 2D. The dummy texture will provide
+ * the proper sample value. The tex_types bitmap defaults to
+ * 2d because of the memset. */
+ if (!texture)
+ continue;
+
+ switch (texture->target)
+ {
+ /* RECT textures are distinguished from 2D textures via np2_fixup */
+ case GL_TEXTURE_RECTANGLE_ARB:
+ case GL_TEXTURE_2D:
+ break;
+
+ case GL_TEXTURE_3D:
+ args->tex_types |= shader_tex_3d << i * WINED3D_PSARGS_TEXTYPE_SHIFT;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_ARB:
+ args->tex_types |= shader_tex_cube << i * WINED3D_PSARGS_TEXTYPE_SHIFT;
+ break;
+ }
+ }
+ }
for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
{
@@ -2274,46 +2304,32 @@ static HRESULT pixelshader_init(struct wined3d_shader *shader, struct wined3d_de
return WINED3D_OK;
}
-void pixelshader_update_samplers(struct wined3d_shader_reg_maps *reg_maps, struct wined3d_texture * const *textures)
+void pixelshader_update_samplers(struct wined3d_shader_reg_maps *reg_maps, WORD tex_types)
{
enum wined3d_sampler_texture_type *sampler_type = reg_maps->sampler_type;
unsigned int i;
if (reg_maps->shader_version.major != 1) return;
- for (i = 0; i < max(MAX_FRAGMENT_SAMPLERS, MAX_VERTEX_SAMPLERS); ++i)
+ /* ps <= 1.3 supports 4 samplers, ps 1.4 6 */
+ for (i = 0; i < 6; ++i)
{
/* We don't sample from this sampler. */
if (!sampler_type[i]) continue;
- if (!textures[i])
- {
- WARN("No texture bound to sampler %u, using 2D.\n", i);
- sampler_type[i] = WINED3DSTT_2D;
- continue;
- }
-
- switch (textures[i]->target)
+ switch ((tex_types >> i * WINED3D_PSARGS_TEXTYPE_SHIFT) & WINED3D_PSARGS_TEXTYPE_MASK)
{
- case GL_TEXTURE_RECTANGLE_ARB:
- case GL_TEXTURE_2D:
- /* We have to select between texture rectangles and 2D
- * textures later because 2.0 and 3.0 shaders only have
- * WINED3DSTT_2D as well. */
+ case shader_tex_2d:
sampler_type[i] = WINED3DSTT_2D;
break;
- case GL_TEXTURE_3D:
+ case shader_tex_3d:
sampler_type[i] = WINED3DSTT_VOLUME;
break;
- case GL_TEXTURE_CUBE_MAP_ARB:
+ case shader_tex_cube:
sampler_type[i] = WINED3DSTT_CUBE;
break;
-
- default:
- FIXME("Unrecognized texture type %#x, using 2D.\n", textures[i]->target);
- sampler_type[i] = WINED3DSTT_2D;
}
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9ca2b10..ac59287 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -746,13 +746,25 @@ enum fogmode {
#define WINED3D_PSARGS_PROJECTED (1 << 3)
#define WINED3D_PSARGS_TEXTRANSFORM_SHIFT 4
#define WINED3D_PSARGS_TEXTRANSFORM_MASK 0xf
+#define WINED3D_PSARGS_TEXTYPE_SHIFT 2
+#define WINED3D_PSARGS_TEXTYPE_MASK 0x3
+
+/* Similar to tex_types, except that it doesn't have 1d textures
+ * (can't be bound), rect textures (handled via np2_fixup) and
+ * none / unknown (treated as 2d and handled via dummy textures). */
+enum shader_tex_types
+{
+ shader_tex_2d = 0,
+ shader_tex_3d = 1,
+ shader_tex_cube = 2,
+};
struct ps_compile_args {
struct color_fixup_desc color_fixup[MAX_FRAGMENT_SAMPLERS];
enum vertexprocessing_mode vp_mode;
enum fogmode fog;
WORD tex_transform; /* ps 1.0-1.3, 4 textures */
- /* Texture types(2D, Cube, 3D) in ps 1.x */
+ WORD tex_types; /* ps 1.0 - 1.4, 6 textures */
WORD srgb_correction;
WORD np2_fixup;
/* Bitmap for NP2 texcoord fixups (16 samplers max currently).
@@ -2636,7 +2648,7 @@ struct wined3d_shader
};
void pixelshader_update_samplers(struct wined3d_shader_reg_maps *reg_maps,
- struct wined3d_texture * const *textures) DECLSPEC_HIDDEN;
+ WORD tex_types) DECLSPEC_HIDDEN;
void find_ps_compile_args(const struct wined3d_state *state,
const struct wined3d_shader *shader, struct ps_compile_args *args) DECLSPEC_HIDDEN;
--
1.8.1.5
More information about the wine-patches
mailing list