wined3d: Move sampler states to wined3d_state.
This commit is contained in:
parent
5b3c1a2082
commit
8fdfc736bf
|
@ -459,7 +459,7 @@ static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned
|
||||||
enum WINED3DSRGB srgb;
|
enum WINED3DSRGB srgb;
|
||||||
|
|
||||||
if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return;
|
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);
|
texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3086,27 +3086,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetSamplerState(IWineD3DDevice *iface,
|
||||||
Sampler -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS);
|
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);
|
ERR("Current Sampler overflows sampleState0 array (sampler %d)\n", Sampler);
|
||||||
return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */
|
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];
|
oldValue = This->stateBlock->state.sampler_states[Sampler][Type];
|
||||||
This->updateStateBlock->samplerState[Sampler][Type] = Value;
|
This->updateStateBlock->state.sampler_states[Sampler][Type] = Value;
|
||||||
This->updateStateBlock->changed.samplerState[Sampler] |= 1 << Type;
|
This->updateStateBlock->changed.samplerState[Sampler] |= 1 << Type;
|
||||||
|
|
||||||
/* Handle recording of state blocks */
|
/* Handle recording of state blocks */
|
||||||
|
@ -3135,11 +3122,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetSamplerState(IWineD3DDevice *iface,
|
||||||
Sampler -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS);
|
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);
|
ERR("Current Sampler overflows sampleState0 array (sampler %d)\n", Sampler);
|
||||||
return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */
|
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);
|
TRACE("(%p) : Returning %#x\n", This, *Value);
|
||||||
|
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
|
@ -5069,12 +5057,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface,
|
||||||
|
|
||||||
TRACE("(%p) : %p\n", This, pNumPasses);
|
TRACE("(%p) : %p\n", This, pNumPasses);
|
||||||
|
|
||||||
for(i = 0; i < MAX_COMBINED_SAMPLERS; i++) {
|
for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i)
|
||||||
if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE) {
|
{
|
||||||
|
if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE)
|
||||||
|
{
|
||||||
WARN("Sampler state %u has minfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i);
|
WARN("Sampler state %u has minfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i);
|
||||||
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
|
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);
|
WARN("Sampler state %u has magfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i);
|
||||||
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
|
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
|
||||||
}
|
}
|
||||||
|
@ -5082,16 +5073,19 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface,
|
||||||
texture = (IWineD3DBaseTextureImpl *) This->stateBlock->textures[i];
|
texture = (IWineD3DBaseTextureImpl *) This->stateBlock->textures[i];
|
||||||
if (!texture || texture->resource.format->Flags & WINED3DFMT_FLAG_FILTERING) continue;
|
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);
|
WARN("Non-filterable texture and mag filter enabled on samper %u, returning E_FAIL\n", i);
|
||||||
return E_FAIL;
|
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);
|
WARN("Non-filterable texture and min filter enabled on samper %u, returning E_FAIL\n", i);
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
if(This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE &&
|
if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE
|
||||||
This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_POINT /* sic! */) {
|
&& 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);
|
WARN("Non-filterable texture and mip filter enabled on samper %u, returning E_FAIL\n", i);
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3596,16 +3596,18 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine
|
||||||
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
|
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
|
||||||
checkGLcall("glActiveTextureARB");
|
checkGLcall("glActiveTextureARB");
|
||||||
|
|
||||||
if(stateblock->textures[sampler]) {
|
if (stateblock->textures[sampler])
|
||||||
BOOL srgb = stateblock->samplerState[sampler][WINED3DSAMP_SRGBTEXTURE];
|
{
|
||||||
|
BOOL srgb = stateblock->state.sampler_states[sampler][WINED3DSAMP_SRGBTEXTURE];
|
||||||
IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler];
|
IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler];
|
||||||
IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb);
|
IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb);
|
||||||
basetexture_apply_state_changes(stateblock->textures[sampler],
|
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])
|
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,
|
glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
|
||||||
GL_TEXTURE_LOD_BIAS_EXT,
|
GL_TEXTURE_LOD_BIAS_EXT,
|
||||||
tmpvalue.f);
|
tmpvalue.f);
|
||||||
|
|
|
@ -852,10 +852,11 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
|
||||||
DWORD stage = This->contained_sampler_states[i].stage;
|
DWORD stage = This->contained_sampler_states[i].stage;
|
||||||
DWORD state = This->contained_sampler_states[i].state;
|
DWORD state = This->contained_sampler_states[i].state;
|
||||||
|
|
||||||
TRACE("Updating sampler state %u, %u to %u (was %u).\n", stage, state,
|
TRACE("Updating sampler state %u, %u to %#x (was %#x).\n", stage, state,
|
||||||
targetStateBlock->samplerState[stage][state], This->samplerState[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)
|
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 stage = This->contained_sampler_states[i].stage;
|
||||||
DWORD state = This->contained_sampler_states[i].state;
|
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;
|
if (stage >= MAX_FRAGMENT_SAMPLERS) stage += WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS;
|
||||||
IWineD3DDevice_SetSamplerState(device, stage, state, value);
|
IWineD3DDevice_SetSamplerState(device, stage, state, value);
|
||||||
|
@ -1255,21 +1256,24 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
|
||||||
This->state.lowest_disabled_stage = 1;
|
This->state.lowest_disabled_stage = 1;
|
||||||
|
|
||||||
/* Sampler states*/
|
/* Sampler states*/
|
||||||
for (i = 0 ; i < MAX_COMBINED_SAMPLERS; i++) {
|
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;
|
TRACE("Setting up default samplers states for sampler %u.\n", i);
|
||||||
This->samplerState[i][WINED3DSAMP_ADDRESSV ] = WINED3DTADDRESS_WRAP;
|
This->state.sampler_states[i][WINED3DSAMP_ADDRESSU] = WINED3DTADDRESS_WRAP;
|
||||||
This->samplerState[i][WINED3DSAMP_ADDRESSW ] = WINED3DTADDRESS_WRAP;
|
This->state.sampler_states[i][WINED3DSAMP_ADDRESSV] = WINED3DTADDRESS_WRAP;
|
||||||
This->samplerState[i][WINED3DSAMP_BORDERCOLOR ] = 0x00;
|
This->state.sampler_states[i][WINED3DSAMP_ADDRESSW] = WINED3DTADDRESS_WRAP;
|
||||||
This->samplerState[i][WINED3DSAMP_MAGFILTER ] = WINED3DTEXF_POINT;
|
This->state.sampler_states[i][WINED3DSAMP_BORDERCOLOR] = 0;
|
||||||
This->samplerState[i][WINED3DSAMP_MINFILTER ] = WINED3DTEXF_POINT;
|
This->state.sampler_states[i][WINED3DSAMP_MAGFILTER] = WINED3DTEXF_POINT;
|
||||||
This->samplerState[i][WINED3DSAMP_MIPFILTER ] = WINED3DTEXF_NONE;
|
This->state.sampler_states[i][WINED3DSAMP_MINFILTER] = WINED3DTEXF_POINT;
|
||||||
This->samplerState[i][WINED3DSAMP_MIPMAPLODBIAS ] = 0;
|
This->state.sampler_states[i][WINED3DSAMP_MIPFILTER] = WINED3DTEXF_NONE;
|
||||||
This->samplerState[i][WINED3DSAMP_MAXMIPLEVEL ] = 0;
|
This->state.sampler_states[i][WINED3DSAMP_MIPMAPLODBIAS] = 0;
|
||||||
This->samplerState[i][WINED3DSAMP_MAXANISOTROPY ] = 1;
|
This->state.sampler_states[i][WINED3DSAMP_MAXMIPLEVEL] = 0;
|
||||||
This->samplerState[i][WINED3DSAMP_SRGBTEXTURE ] = 0;
|
This->state.sampler_states[i][WINED3DSAMP_MAXANISOTROPY] = 1;
|
||||||
This->samplerState[i][WINED3DSAMP_ELEMENTINDEX ] = 0; /* TODO: Indicates which element of a multielement texture to use */
|
This->state.sampler_states[i][WINED3DSAMP_SRGBTEXTURE] = 0;
|
||||||
This->samplerState[i][WINED3DSAMP_DMAPOFFSET ] = 0; /* TODO: Vertex offset in the presampled displacement map */
|
/* 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)
|
for (i = 0; i < gl_info->limits.textures; ++i)
|
||||||
|
|
|
@ -43,7 +43,7 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE
|
||||||
if (!device->isInDraw) context = context_acquire(device, NULL);
|
if (!device->isInDraw) context = context_acquire(device, NULL);
|
||||||
else if (gl_info->supported[EXT_TEXTURE_SRGB] && This->baseTexture.bindCount > 0)
|
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;
|
srgb_was_toggled = This->baseTexture.is_srgb != srgb_mode;
|
||||||
This->baseTexture.is_srgb = srgb_mode;
|
This->baseTexture.is_srgb = srgb_mode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2349,6 +2349,8 @@ struct wined3d_stream_state
|
||||||
|
|
||||||
struct wined3d_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 texture_states[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1];
|
||||||
DWORD lowest_disabled_stage;
|
DWORD lowest_disabled_stage;
|
||||||
|
|
||||||
|
@ -2418,9 +2420,6 @@ struct IWineD3DStateBlockImpl
|
||||||
/* Texture */
|
/* Texture */
|
||||||
IWineD3DBaseTexture *textures[MAX_COMBINED_SAMPLERS];
|
IWineD3DBaseTexture *textures[MAX_COMBINED_SAMPLERS];
|
||||||
|
|
||||||
/* Sampler States */
|
|
||||||
DWORD samplerState[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1];
|
|
||||||
|
|
||||||
/* Contained state management */
|
/* Contained state management */
|
||||||
DWORD contained_render_states[WINEHIGHEST_RENDER_STATE + 1];
|
DWORD contained_render_states[WINEHIGHEST_RENDER_STATE + 1];
|
||||||
unsigned int num_contained_render_states;
|
unsigned int num_contained_render_states;
|
||||||
|
|
Loading…
Reference in New Issue