[PATCH 4/4] wined3d: Move sampler states to wined3d_state.
Henri Verbeet
hverbeet at codeweavers.com
Thu Sep 16 04:19:58 CDT 2010
---
dlls/wined3d/device.c | 50 +++++++++++++++++----------------------
dlls/wined3d/state.c | 10 ++++---
dlls/wined3d/stateblock.c | 42 ++++++++++++++++++---------------
dlls/wined3d/volumetexture.c | 2 +-
dlls/wined3d/wined3d_private.h | 5 +--
5 files changed, 54 insertions(+), 55 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 814f060..54f37af 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -459,7 +459,7 @@ static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned
enum WINED3DSRGB srgb;
if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return;
- srgb = stateblock->samplerState[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB;
+ srgb = stateblock->state.sampler_states[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB;
texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb);
}
@@ -3086,27 +3086,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetSamplerState(IWineD3DDevice *iface,
Sampler -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS);
}
- if (Sampler >= sizeof(This->stateBlock->samplerState)/sizeof(This->stateBlock->samplerState[0])) {
+ if (Sampler >= sizeof(This->stateBlock->state.sampler_states) / sizeof(*This->stateBlock->state.sampler_states))
+ {
ERR("Current Sampler overflows sampleState0 array (sampler %d)\n", Sampler);
return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */
}
- /**
- * SetSampler is designed to allow for more than the standard up to 8 textures
- * and Geforce has stopped supporting more than 6 standard textures in openGL.
- * So I have to use ARB for Gforce. (maybe if the sampler > 4 then use ARB?)
- *
- * http://developer.nvidia.com/object/General_FAQ.html#t6
- *
- * There are two new settings for GForce
- * the sampler one:
- * GL_MAX_TEXTURE_IMAGE_UNITS_ARB
- * and the texture one:
- * GL_MAX_TEXTURE_COORDS_ARB.
- * Ok GForce say it's ok to use glTexParameter/glGetTexParameter(...).
- ******************/
-
- oldValue = This->stateBlock->samplerState[Sampler][Type];
- This->updateStateBlock->samplerState[Sampler][Type] = Value;
+
+ oldValue = This->stateBlock->state.sampler_states[Sampler][Type];
+ This->updateStateBlock->state.sampler_states[Sampler][Type] = Value;
This->updateStateBlock->changed.samplerState[Sampler] |= 1 << Type;
/* Handle recording of state blocks */
@@ -3135,11 +3122,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetSamplerState(IWineD3DDevice *iface,
Sampler -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS);
}
- if (Sampler >= sizeof(This->stateBlock->samplerState)/sizeof(This->stateBlock->samplerState[0])) {
+ if (Sampler >= sizeof(This->stateBlock->state.sampler_states) / sizeof(*This->stateBlock->state.sampler_states))
+ {
ERR("Current Sampler overflows sampleState0 array (sampler %d)\n", Sampler);
return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */
}
- *Value = This->stateBlock->samplerState[Sampler][Type];
+ *Value = This->stateBlock->state.sampler_states[Sampler][Type];
TRACE("(%p) : Returning %#x\n", This, *Value);
return WINED3D_OK;
@@ -5069,12 +5057,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface,
TRACE("(%p) : %p\n", This, pNumPasses);
- for(i = 0; i < MAX_COMBINED_SAMPLERS; i++) {
- if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE) {
+ for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
+ {
+ if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE)
+ {
WARN("Sampler state %u has minfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i);
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
}
- if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] == WINED3DTEXF_NONE) {
+ if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MAGFILTER] == WINED3DTEXF_NONE)
+ {
WARN("Sampler state %u has magfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i);
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
}
@@ -5082,16 +5073,19 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface,
texture = (IWineD3DBaseTextureImpl *) This->stateBlock->textures[i];
if (!texture || texture->resource.format->Flags & WINED3DFMT_FLAG_FILTERING) continue;
- if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] != WINED3DTEXF_POINT) {
+ if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MAGFILTER] != WINED3DTEXF_POINT)
+ {
WARN("Non-filterable texture and mag filter enabled on samper %u, returning E_FAIL\n", i);
return E_FAIL;
}
- if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] != WINED3DTEXF_POINT) {
+ if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MINFILTER] != WINED3DTEXF_POINT)
+ {
WARN("Non-filterable texture and min filter enabled on samper %u, returning E_FAIL\n", i);
return E_FAIL;
}
- if(This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE &&
- This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_POINT /* sic! */) {
+ if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE
+ && This->stateBlock->state.sampler_states[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_POINT)
+ {
WARN("Non-filterable texture and mip filter enabled on samper %u, returning E_FAIL\n", i);
return E_FAIL;
}
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 36e605d..5d0d1df 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3596,16 +3596,18 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
checkGLcall("glActiveTextureARB");
- if(stateblock->textures[sampler]) {
- BOOL srgb = stateblock->samplerState[sampler][WINED3DSAMP_SRGBTEXTURE];
+ if (stateblock->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],
- stateblock->state.texture_states[sampler], stateblock->samplerState[sampler], gl_info);
+ stateblock->state.texture_states[sampler],
+ stateblock->state.sampler_states[sampler], gl_info);
if (gl_info->supported[EXT_TEXTURE_LOD_BIAS])
{
- tmpvalue.d = stateblock->samplerState[sampler][WINED3DSAMP_MIPMAPLODBIAS];
+ tmpvalue.d = stateblock->state.sampler_states[sampler][WINED3DSAMP_MIPMAPLODBIAS];
glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
GL_TEXTURE_LOD_BIAS_EXT,
tmpvalue.f);
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index c952697..41fca5a 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -852,10 +852,11 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
DWORD stage = This->contained_sampler_states[i].stage;
DWORD state = This->contained_sampler_states[i].state;
- TRACE("Updating sampler state %u, %u to %u (was %u).\n", stage, state,
- targetStateBlock->samplerState[stage][state], This->samplerState[stage][state]);
+ TRACE("Updating sampler state %u, %u to %#x (was %#x).\n", stage, state,
+ targetStateBlock->state.sampler_states[stage][state],
+ This->state.sampler_states[stage][state]);
- This->samplerState[stage][state] = targetStateBlock->samplerState[stage][state];
+ This->state.sampler_states[stage][state] = targetStateBlock->state.sampler_states[stage][state];
}
if (This->changed.pixelShader && This->pixelShader != targetStateBlock->pixelShader)
@@ -960,7 +961,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
{
DWORD stage = This->contained_sampler_states[i].stage;
DWORD state = This->contained_sampler_states[i].state;
- DWORD value = This->samplerState[stage][state];
+ DWORD value = This->state.sampler_states[stage][state];
if (stage >= MAX_FRAGMENT_SAMPLERS) stage += WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS;
IWineD3DDevice_SetSamplerState(device, stage, state, value);
@@ -1255,21 +1256,24 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
This->state.lowest_disabled_stage = 1;
/* Sampler states*/
- for (i = 0 ; i < MAX_COMBINED_SAMPLERS; i++) {
- TRACE("Setting up default samplers states for sampler %d\n", i);
- This->samplerState[i][WINED3DSAMP_ADDRESSU ] = WINED3DTADDRESS_WRAP;
- This->samplerState[i][WINED3DSAMP_ADDRESSV ] = WINED3DTADDRESS_WRAP;
- This->samplerState[i][WINED3DSAMP_ADDRESSW ] = WINED3DTADDRESS_WRAP;
- This->samplerState[i][WINED3DSAMP_BORDERCOLOR ] = 0x00;
- This->samplerState[i][WINED3DSAMP_MAGFILTER ] = WINED3DTEXF_POINT;
- This->samplerState[i][WINED3DSAMP_MINFILTER ] = WINED3DTEXF_POINT;
- This->samplerState[i][WINED3DSAMP_MIPFILTER ] = WINED3DTEXF_NONE;
- This->samplerState[i][WINED3DSAMP_MIPMAPLODBIAS ] = 0;
- This->samplerState[i][WINED3DSAMP_MAXMIPLEVEL ] = 0;
- This->samplerState[i][WINED3DSAMP_MAXANISOTROPY ] = 1;
- This->samplerState[i][WINED3DSAMP_SRGBTEXTURE ] = 0;
- This->samplerState[i][WINED3DSAMP_ELEMENTINDEX ] = 0; /* TODO: Indicates which element of a multielement texture to use */
- This->samplerState[i][WINED3DSAMP_DMAPOFFSET ] = 0; /* TODO: Vertex offset in the presampled displacement map */
+ for (i = 0 ; i < MAX_COMBINED_SAMPLERS; ++i)
+ {
+ TRACE("Setting up default samplers states for sampler %u.\n", i);
+ This->state.sampler_states[i][WINED3DSAMP_ADDRESSU] = WINED3DTADDRESS_WRAP;
+ This->state.sampler_states[i][WINED3DSAMP_ADDRESSV] = WINED3DTADDRESS_WRAP;
+ This->state.sampler_states[i][WINED3DSAMP_ADDRESSW] = WINED3DTADDRESS_WRAP;
+ This->state.sampler_states[i][WINED3DSAMP_BORDERCOLOR] = 0;
+ This->state.sampler_states[i][WINED3DSAMP_MAGFILTER] = WINED3DTEXF_POINT;
+ This->state.sampler_states[i][WINED3DSAMP_MINFILTER] = WINED3DTEXF_POINT;
+ This->state.sampler_states[i][WINED3DSAMP_MIPFILTER] = WINED3DTEXF_NONE;
+ This->state.sampler_states[i][WINED3DSAMP_MIPMAPLODBIAS] = 0;
+ This->state.sampler_states[i][WINED3DSAMP_MAXMIPLEVEL] = 0;
+ This->state.sampler_states[i][WINED3DSAMP_MAXANISOTROPY] = 1;
+ This->state.sampler_states[i][WINED3DSAMP_SRGBTEXTURE] = 0;
+ /* TODO: Indicates which element of a multielement texture to use. */
+ This->state.sampler_states[i][WINED3DSAMP_ELEMENTINDEX] = 0;
+ /* TODO: Vertex offset in the presampled displacement map. */
+ This->state.sampler_states[i][WINED3DSAMP_DMAPOFFSET] = 0;
}
for (i = 0; i < gl_info->limits.textures; ++i)
diff --git a/dlls/wined3d/volumetexture.c b/dlls/wined3d/volumetexture.c
index 2e9fec9..a69ff68 100644
--- a/dlls/wined3d/volumetexture.c
+++ b/dlls/wined3d/volumetexture.c
@@ -43,7 +43,7 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE
if (!device->isInDraw) context = context_acquire(device, NULL);
else if (gl_info->supported[EXT_TEXTURE_SRGB] && This->baseTexture.bindCount > 0)
{
- srgb_mode = device->stateBlock->samplerState[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE];
+ srgb_mode = device->stateBlock->state.sampler_states[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE];
srgb_was_toggled = This->baseTexture.is_srgb != srgb_mode;
This->baseTexture.is_srgb = srgb_mode;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 61c4653..90082ba 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2349,6 +2349,8 @@ struct wined3d_stream_state
struct wined3d_state
{
+ /* Sampler States */
+ 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;
@@ -2418,9 +2420,6 @@ struct IWineD3DStateBlockImpl
/* Texture */
IWineD3DBaseTexture *textures[MAX_COMBINED_SAMPLERS];
- /* Sampler States */
- DWORD samplerState[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
-
/* 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