[PATCH 3/4] wined3d: Move texture bindings to wined3d_state.
Henri Verbeet
hverbeet at codeweavers.com
Fri Sep 17 04:59:40 CDT 2010
---
dlls/wined3d/arb_program_shader.c | 14 ++++++------
dlls/wined3d/device.c | 27 ++++++++++++-----------
dlls/wined3d/drawprim.c | 2 +-
dlls/wined3d/glsl_shader.c | 39 +++++++++++++++------------------
dlls/wined3d/nvidia_texture_shader.c | 4 +-
dlls/wined3d/shader.c | 2 +-
dlls/wined3d/state.c | 31 ++++++++++++++-------------
dlls/wined3d/stateblock.c | 18 +++++++++------
dlls/wined3d/utils.c | 13 +++++------
dlls/wined3d/wined3d_private.h | 5 +---
10 files changed, 77 insertions(+), 78 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 21d19a6..9b47d7a 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -503,8 +503,8 @@ static void shader_arb_load_np2fixup_constants(
for (i = 0; active; active >>= 1, ++i) {
const unsigned char idx = fixup->super.idx[i];
- const IWineD3DTextureImpl* const tex = (const IWineD3DTextureImpl*) stateBlock->textures[i];
- GLfloat* tex_dim = &np2fixup_constants[(idx >> 1) * 4];
+ const IWineD3DBaseTextureImpl *tex = stateBlock->state.textures[i];
+ GLfloat *tex_dim = &np2fixup_constants[(idx >> 1) * 4];
if (!(active & 1)) continue;
@@ -1326,6 +1326,7 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
{
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
DWORD sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
+ IWineD3DBaseTextureImpl *texture;
const char *tex_type;
BOOL np2_fixup = FALSE;
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
@@ -1343,9 +1344,8 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
break;
case WINED3DSTT_2D:
- if (device->stateBlock->textures[sampler_idx]
- && ((IWineD3DBaseTextureImpl *)device->stateBlock->textures[sampler_idx])->baseTexture.target
- == GL_TEXTURE_RECTANGLE_ARB)
+ texture = device->stateBlock->state.textures[sampler_idx];
+ if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB)
{
tex_type = "RECT";
} else {
@@ -4229,6 +4229,7 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
/* GL locking is done by the caller */
static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb_ps_compile_args *args)
{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
UINT i;
DWORD new_size;
struct arb_ps_compiled_shader *new_array;
@@ -4238,7 +4239,6 @@ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl *
if (!shader->baseShader.backend_data)
{
- IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) shader->baseShader.device;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
struct shader_arb_priv *priv = device->shader_priv;
@@ -4293,7 +4293,7 @@ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl *
shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
pixelshader_update_samplers(&shader->baseShader.reg_maps,
- ((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->textures);
+ (IWineD3DBaseTexture **)device->stateBlock->state.textures);
if (!shader_buffer_init(&buffer))
{
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 7c96247..7bf601b 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -458,7 +458,7 @@ static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned
IWineD3DBaseTextureImpl *texture;
enum WINED3DSRGB srgb;
- if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return;
+ if (!(texture = stateblock->state.textures[idx])) return;
srgb = stateblock->state.sampler_states[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB;
texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb);
}
@@ -4319,7 +4319,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
stage -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS);
/* Windows accepts overflowing this array... we do not. */
- if (stage >= sizeof(This->stateBlock->textures) / sizeof(*This->stateBlock->textures))
+ if (stage >= sizeof(This->stateBlock->state.textures) / sizeof(*This->stateBlock->state.textures))
{
WARN("Ignoring invalid stage %u.\n", stage);
return WINED3D_OK;
@@ -4334,7 +4334,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
This->updateStateBlock->changed.textures |= 1 << stage;
- prev = This->updateStateBlock->textures[stage];
+ prev = (IWineD3DBaseTexture *)This->updateStateBlock->state.textures[stage];
TRACE("Previous texture %p.\n", prev);
if (texture == prev)
@@ -4344,7 +4344,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
}
TRACE("Setting new texture to %p.\n", texture);
- This->updateStateBlock->textures[stage] = texture;
+ This->updateStateBlock->state.textures[stage] = (IWineD3DBaseTextureImpl *)texture;
if (This->isRecordingState)
{
@@ -4401,7 +4401,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface,
TRACE("Searching for other stages the texture is bound to.\n");
for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
{
- if (This->updateStateBlock->textures[i] == prev)
+ if (This->updateStateBlock->state.textures[i] == t)
{
TRACE("Texture is also bound to stage %u.\n", i);
t->baseTexture.sampler = i;
@@ -4425,12 +4425,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetTexture(IWineD3DDevice *iface, DWORD
Stage -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS);
}
- if (Stage >= sizeof(This->stateBlock->textures)/sizeof(This->stateBlock->textures[0])) {
+ if (Stage >= sizeof(This->stateBlock->state.textures) / sizeof(*This->stateBlock->state.textures))
+ {
ERR("Current stage overflows textures array (stage %d)\n", Stage);
return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */
}
- *ppTexture=This->stateBlock->textures[Stage];
+ *ppTexture = (IWineD3DBaseTexture *)This->stateBlock->state.textures[Stage];
if (*ppTexture)
IWineD3DBaseTexture_AddRef(*ppTexture);
@@ -5068,7 +5069,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface,
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
}
- texture = (IWineD3DBaseTextureImpl *) This->stateBlock->textures[i];
+ texture = This->stateBlock->state.textures[i];
if (!texture || texture->resource.format->Flags & WINED3DFMT_FLAG_FILTERING) continue;
if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MAGFILTER] != WINED3DTEXF_POINT)
@@ -5102,7 +5103,7 @@ static void dirtify_p8_texture_samplers(IWineD3DDeviceImpl *device)
for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
{
- IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl*)device->stateBlock->textures[i];
+ IWineD3DBaseTextureImpl *texture = device->stateBlock->state.textures[i];
if (texture && (texture->resource.format->id == WINED3DFMT_P8_UINT
|| texture->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM))
{
@@ -6593,19 +6594,19 @@ void device_resource_released(IWineD3DDeviceImpl *device, IWineD3DResource *reso
case WINED3DRTYPE_VOLUMETEXTURE:
for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
{
- if (device->stateBlock && device->stateBlock->textures[i] == (IWineD3DBaseTexture *)resource)
+ if (device->stateBlock && device->stateBlock->state.textures[i] == (IWineD3DBaseTextureImpl *)resource)
{
ERR("Texture %p is still in use by stateblock %p, stage %u.\n",
resource, device->stateBlock, i);
- device->stateBlock->textures[i] = NULL;
+ device->stateBlock->state.textures[i] = NULL;
}
if (device->updateStateBlock != device->stateBlock
- && device->updateStateBlock->textures[i] == (IWineD3DBaseTexture *)resource)
+ && device->updateStateBlock->state.textures[i] == (IWineD3DBaseTextureImpl *)resource)
{
ERR("Texture %p is still in use by stateblock %p, stage %u.\n",
resource, device->updateStateBlock, i);
- device->updateStateBlock->textures[i] = NULL;
+ device->updateStateBlock->state.textures[i] = NULL;
}
}
break;
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 011837f..28b3cb6 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -178,7 +178,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
continue;
}
- if (!pixelShader && !This->stateBlock->textures[textureNo]) continue;
+ if (!pixelShader && !This->stateBlock->state.textures[textureNo]) continue;
if (texture_idx == WINED3D_UNMAPPED_STAGE) continue;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index f615233..2382162 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -708,8 +708,8 @@ static void shader_glsl_load_np2fixup_constants(
for (i = 0; fixup; fixup >>= 1, ++i) {
const unsigned char idx = prog->np2Fixup_info->idx[i];
- const IWineD3DBaseTextureImpl* const tex = (const IWineD3DBaseTextureImpl*) stateBlock->textures[i];
- GLfloat* tex_dim = &np2fixup_constants[(idx >> 1) * 4];
+ const IWineD3DBaseTextureImpl *tex = stateBlock->state.textures[i];
+ GLfloat *tex_dim = &np2fixup_constants[(idx >> 1) * 4];
if (!tex)
{
@@ -1050,6 +1050,8 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
for (i = 0; i < This->baseShader.limits.sampler; i++) {
if (reg_maps->sampler_type[i])
{
+ IWineD3DBaseTextureImpl *texture;
+
switch (reg_maps->sampler_type[i])
{
case WINED3DSTT_1D:
@@ -1059,20 +1061,17 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i);
break;
case WINED3DSTT_2D:
+ texture = device->stateBlock->state.textures[i];
if (pshader && ps_args->shadow & (1 << i))
{
- if (device->stateBlock->textures[i]
- && ((IWineD3DBaseTextureImpl *)device->stateBlock->textures[i])->baseTexture.target
- == GL_TEXTURE_RECTANGLE_ARB)
+ if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB)
shader_addline(buffer, "uniform sampler2DRectShadow %csampler%u;\n", prefix, i);
else
shader_addline(buffer, "uniform sampler2DShadow %csampler%u;\n", prefix, i);
}
else
{
- if (device->stateBlock->textures[i]
- && ((IWineD3DBaseTextureImpl *)device->stateBlock->textures[i])->baseTexture.target
- == GL_TEXTURE_RECTANGLE_ARB)
+ if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB)
shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i);
else
shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
@@ -3017,6 +3016,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
glsl_sample_function_t sample_function;
+ IWineD3DBaseTextureImpl *texture;
DWORD sample_flags = 0;
DWORD sampler_idx;
DWORD mask = 0, swizzle;
@@ -3025,6 +3025,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
* 2.0+: Use provided sampler source. */
if (shader_version < WINED3D_SHADER_VERSION(2,0)) sampler_idx = ins->dst[0].reg.idx;
else sampler_idx = ins->src[1].reg.idx;
+ texture = deviceImpl->stateBlock->state.textures[sampler_idx];
if (shader_version < WINED3D_SHADER_VERSION(1,4))
{
@@ -3063,12 +3064,8 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
}
}
- if (deviceImpl->stateBlock->textures[sampler_idx]
- && ((IWineD3DBaseTextureImpl *)deviceImpl->stateBlock->textures[sampler_idx])->baseTexture.target
- == GL_TEXTURE_RECTANGLE_ARB)
- {
+ if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB)
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
- }
shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function);
mask |= sample_function.coord_mask;
@@ -3110,6 +3107,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD;
DWORD sampler_idx;
DWORD swizzle = ins->src[1].swizzle;
+ IWineD3DBaseTextureImpl *texture;
if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4])
{
@@ -3119,9 +3117,8 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
}
sampler_idx = ins->src[1].reg.idx;
- if (deviceImpl->stateBlock->textures[sampler_idx]
- && ((IWineD3DBaseTextureImpl *)deviceImpl->stateBlock->textures[sampler_idx])->baseTexture.target
- == GL_TEXTURE_RECTANGLE_ARB)
+ texture = deviceImpl->stateBlock->state.textures[sampler_idx];
+ if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB)
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function);
@@ -3143,11 +3140,11 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD;
DWORD sampler_idx;
DWORD swizzle = ins->src[1].swizzle;
+ IWineD3DBaseTextureImpl *texture;
sampler_idx = ins->src[1].reg.idx;
- if (deviceImpl->stateBlock->textures[sampler_idx]
- && ((IWineD3DBaseTextureImpl *)deviceImpl->stateBlock->textures[sampler_idx])->baseTexture.target
- == GL_TEXTURE_RECTANGLE_ARB)
+ texture = deviceImpl->stateBlock->state.textures[sampler_idx];
+ if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB)
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function);
@@ -4131,6 +4128,7 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
struct wined3d_shader_buffer *buffer, IWineD3DPixelShaderImpl *shader,
const struct ps_compile_args *args, const struct ps_np2fixup_info **np2fixup_info)
{
+ struct wined3d_state *state = &((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->state;
UINT i;
DWORD new_size;
struct glsl_ps_compiled_shader *new_array;
@@ -4187,8 +4185,7 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
memset(&shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup, 0, sizeof(struct ps_np2fixup_info));
if (args->np2_fixup) np2fixup = &shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup;
- pixelshader_update_samplers(&shader->baseShader.reg_maps,
- ((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->textures);
+ pixelshader_update_samplers(&shader->baseShader.reg_maps, (IWineD3DBaseTexture **)state->textures);
shader_buffer_clear(buffer);
ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup);
diff --git a/dlls/wined3d/nvidia_texture_shader.c b/dlls/wined3d/nvidia_texture_shader.c
index 1cb8b84..380986a 100644
--- a/dlls/wined3d/nvidia_texture_shader.c
+++ b/dlls/wined3d/nvidia_texture_shader.c
@@ -43,9 +43,9 @@ static void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateb
context->texShaderBumpMap &= ~(1 << stage);
}
- if (stateblock->textures[stage])
+ if (stateblock->state.textures[stage])
{
- switch (((IWineD3DBaseTextureImpl *)stateblock->textures[stage])->baseTexture.target)
+ switch (stateblock->state.textures[stage]->baseTexture.target)
{
case GL_TEXTURE_2D:
glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, bumpmap ? GL_OFFSET_TEXTURE_2D_NV : GL_TEXTURE_2D);
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index ba728d4..9077ef8 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2086,7 +2086,7 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader,
for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i)
{
if (!shader->baseShader.reg_maps.sampler_type[i]) continue;
- texture = (IWineD3DBaseTextureImpl *)stateblock->textures[i];
+ texture = stateblock->state.textures[i];
if (!texture)
{
args->color_fixup[i] = COLOR_FIXUP_IDENTITY;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 0b5bc3e..5aac387 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -496,13 +496,13 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
* used WINED3DRS_COLORKEYENABLE state(which is d3d <= 3 only). The texture function will call alpha
* in case it finds some texture+colorkeyenable combination which needs extra care.
*/
- if (stateblock->textures[0])
+ if (stateblock->state.textures[0])
{
- GLenum texture_dimensions = ((IWineD3DBaseTextureImpl *)stateblock->textures[0])->baseTexture.target;
+ IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0];
+ GLenum texture_dimensions = texture->baseTexture.target;
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0];
if (surf->CKeyFlags & WINEDDSD_CKSRCBLT)
@@ -2111,7 +2111,7 @@ static void set_tex_op(const struct wined3d_context *context, IWineD3DDevice *if
op = WINED3DTOP_SELECTARG1;
}
- if (isAlpha && !This->stateBlock->textures[Stage] && arg1 == WINED3DTA_TEXTURE)
+ if (isAlpha && !This->stateBlock->state.textures[Stage] && arg1 == WINED3DTA_TEXTURE)
{
get_src_and_opr(WINED3DTA_DIFFUSE, isAlpha, &src1, &opr1);
} else {
@@ -3184,9 +3184,9 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d
arg2 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG2];
arg0 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG0];
- if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && !stage && stateblock->textures[0])
+ if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && !stage && stateblock->state.textures[0])
{
- IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0];
GLenum texture_dimensions = texture->baseTexture.target;
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
@@ -3292,7 +3292,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
stateblock->device->frag_pipe->ffp_proj_control);
/* The sampler applying function calls us if this changes */
- if ((context->lastWasPow2Texture & (1 << texUnit)) && stateblock->textures[texUnit])
+ if ((context->lastWasPow2Texture & (1 << texUnit)) && stateblock->state.textures[texUnit])
{
if(generated) {
FIXME("Non-power2 texture being used with generated texture coords\n");
@@ -3301,7 +3301,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
fixed-function-pipeline fixup via pow2Matrix when no PS is used. */
if (!use_ps(stateblock)) {
TRACE("Non power two matrix multiply fixup\n");
- glMultMatrixf(((IWineD3DTextureImpl *) stateblock->textures[texUnit])->baseTexture.pow2Matrix);
+ glMultMatrixf(stateblock->state.textures[texUnit]->baseTexture.pow2Matrix);
}
}
}
@@ -3579,7 +3579,7 @@ static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
const DWORD sampler = state - STATE_SAMPLER(0);
- IWineD3DBaseTexture *texture = stateblock->textures[sampler];
+ IWineD3DBaseTextureImpl *texture = stateblock->state.textures[sampler];
TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context);
@@ -3592,7 +3592,7 @@ static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, s
* misc pipeline
*/
if(sampler < MAX_TEXTURES) {
- const BOOL texIsPow2 = !((IWineD3DBaseTextureImpl *)texture)->baseTexture.pow2Matrix_identity;
+ const BOOL texIsPow2 = !texture->baseTexture.pow2Matrix_identity;
if (texIsPow2 || (context->lastWasPow2Texture & (1 << sampler)))
{
@@ -3632,12 +3632,13 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
checkGLcall("glActiveTextureARB");
- if (stateblock->textures[sampler])
+ if (stateblock->state.textures[sampler])
{
+ IWineD3DBaseTexture *texture = (IWineD3DBaseTexture *)stateblock->state.textures[sampler];
BOOL srgb = stateblock->state.sampler_states[sampler][WINED3DSAMP_SRGBTEXTURE];
- IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler];
- IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb);
- basetexture_apply_state_changes(stateblock->textures[sampler],
+
+ IWineD3DBaseTexture_BindTexture(texture, srgb);
+ basetexture_apply_state_changes(texture,
stateblock->state.texture_states[sampler],
stateblock->state.sampler_states[sampler], gl_info);
@@ -3662,7 +3663,7 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine
}
/* Trigger shader constant reloading (for NP2 texcoord fixup) */
- if (!tex_impl->baseTexture.pow2Matrix_identity)
+ if (!stateblock->state.textures[sampler]->baseTexture.pow2Matrix_identity)
{
IWineD3DDeviceImpl *d3ddevice = stateblock->device;
d3ddevice->shader_backend->shader_load_np2fixup_constants(
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 41fca5a..c06e14b 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -496,7 +496,8 @@ static ULONG WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) {
for (counter = 0; counter < MAX_COMBINED_SAMPLERS; counter++)
{
- if (This->textures[counter]) IWineD3DBaseTexture_Release(This->textures[counter]);
+ if (This->state.textures[counter])
+ IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)This->state.textures[counter]);
}
for (counter = 0; counter < MAX_STREAMS; ++counter)
@@ -840,11 +841,14 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
{
if (!(map & 1)) continue;
- TRACE("Updating texture %u to %p (was %p).\n", i, targetStateBlock->textures[i], This->textures[i]);
+ TRACE("Updating texture %u to %p (was %p).\n",
+ i, targetStateBlock->state.textures[i], This->state.textures[i]);
- if (targetStateBlock->textures[i]) IWineD3DBaseTexture_AddRef(targetStateBlock->textures[i]);
- if (This->textures[i]) IWineD3DBaseTexture_Release(This->textures[i]);
- This->textures[i] = targetStateBlock->textures[i];
+ if (targetStateBlock->state.textures[i])
+ IWineD3DBaseTexture_AddRef((IWineD3DBaseTexture *)targetStateBlock->state.textures[i]);
+ if (This->state.textures[i])
+ IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)This->state.textures[i]);
+ This->state.textures[i] = targetStateBlock->state.textures[i];
}
for (i = 0; i < This->num_contained_sampler_states; ++i)
@@ -1029,7 +1033,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
if (!(map & 1)) continue;
stage = i < MAX_FRAGMENT_SAMPLERS ? i : WINED3DVERTEXTEXTURESAMPLER0 + i - MAX_FRAGMENT_SAMPLERS;
- IWineD3DDevice_SetTexture(device, stage, This->textures[i]);
+ IWineD3DDevice_SetTexture(device, stage, (IWineD3DBaseTexture *)This->state.textures[i]);
}
map = This->changed.clipplane;
@@ -1280,7 +1284,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
{
/* Note: This avoids calling SetTexture, so pretend it has been called */
This->changed.textures |= 1 << i;
- This->textures[i] = NULL;
+ This->state.textures[i] = NULL;
}
/* check the return values, because the GetBackBuffer call isn't valid for ddraw */
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 6f535a7..994c1e2 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -2368,7 +2368,7 @@ GLenum CompareFunc(DWORD func) {
BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) {
if (op == WINED3DTOP_DISABLE) return FALSE;
- if (This->stateBlock->textures[stage]) return FALSE;
+ if (This->stateBlock->state.textures[stage]) return FALSE;
if ((arg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE
&& op != WINED3DTOP_SELECTARG2) return TRUE;
@@ -2745,8 +2745,7 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
break;
}
- texture = (IWineD3DBaseTextureImpl *) stateblock->textures[i];
- if (texture)
+ if ((texture = stateblock->state.textures[i]))
{
settings->op[i].color_fixup = texture->resource.format->color_fixup;
if (ignore_textype)
@@ -2809,9 +2808,9 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
aarg0 = (args[aop] & ARG0) ? stateblock->state.texture_states[i][WINED3DTSS_ALPHAARG0] : ARG_UNUSED;
}
- if (!i && stateblock->textures[0] && stateblock->state.render_states[WINED3DRS_COLORKEYENABLE])
+ if (!i && stateblock->state.textures[0] && stateblock->state.render_states[WINED3DRS_COLORKEYENABLE])
{
- IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0];
GLenum texture_dimensions = texture->baseTexture.target;
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
@@ -2980,9 +2979,9 @@ void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock
{
const struct wined3d_gl_info *gl_info = context->gl_info;
- if (stateblock->textures[stage])
+ if (stateblock->state.textures[stage])
{
- switch (((IWineD3DBaseTextureImpl *)stateblock->textures[stage])->baseTexture.target)
+ switch (stateblock->state.textures[stage]->baseTexture.target)
{
case GL_TEXTURE_2D:
glDisable(GL_TEXTURE_3D);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d542de0..c54be90 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2349,7 +2349,7 @@ struct wined3d_stream_state
struct wined3d_state
{
- /* Sampler States */
+ IWineD3DBaseTextureImpl *textures[MAX_COMBINED_SAMPLERS];
DWORD sampler_states[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
DWORD texture_states[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
DWORD lowest_disabled_stage;
@@ -2417,9 +2417,6 @@ struct IWineD3DStateBlockImpl
INT pixelShaderConstantI[MAX_CONST_I * 4];
float *pixelShaderConstantF;
- /* Texture */
- IWineD3DBaseTexture *textures[MAX_COMBINED_SAMPLERS];
-
/* Contained state management */
DWORD contained_render_states[WINEHIGHEST_RENDER_STATE + 1];
unsigned int num_contained_render_states;
--
1.7.1
More information about the wine-patches
mailing list