st/nine: Do not use NineBaseTexture9 in nine_context
Some fields are subject to modification outside of nine_context (SetLod, etc). Signed-off-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
parent
152d007769
commit
7ebdbb573b
|
@ -203,17 +203,6 @@ NineBaseTexture9_UploadSelf( struct NineBaseTexture9 *This )
|
|||
pipe_sampler_view_reference(&This->view[0], NULL);
|
||||
pipe_sampler_view_reference(&This->view[1], NULL);
|
||||
|
||||
if (This->bind_count) {
|
||||
/* mark state dirty */
|
||||
struct nine_state *state = &This->base.base.device->state;
|
||||
struct nine_context *context = &This->base.base.device->context;
|
||||
unsigned s;
|
||||
for (s = 0; s < NINE_MAX_SAMPLERS; ++s)
|
||||
/* Dirty tracking is done in device9 state, not nine_context. */
|
||||
if (state->texture[s] == This)
|
||||
context->changed.group |= NINE_STATE_TEXTURE;
|
||||
}
|
||||
|
||||
/* Allocate a new resource */
|
||||
hr = NineBaseTexture9_CreatePipeResource(This, This->managed.lod_resident != -1);
|
||||
if (FAILED(hr))
|
||||
|
@ -378,6 +367,16 @@ NineBaseTexture9_UploadSelf( struct NineBaseTexture9 *This )
|
|||
if (This->base.usage & D3DUSAGE_AUTOGENMIPMAP)
|
||||
This->dirty_mip = TRUE;
|
||||
|
||||
/* Set again the textures currently bound to update the texture data */
|
||||
if (This->bind_count) {
|
||||
struct nine_state *state = &This->base.base.device->state;
|
||||
unsigned s;
|
||||
for (s = 0; s < NINE_MAX_SAMPLERS; ++s)
|
||||
/* Dirty tracking is done in device9 state, not nine_context. */
|
||||
if (state->texture[s] == This)
|
||||
nine_context_set_texture(This->base.base.device, s, This);
|
||||
}
|
||||
|
||||
DBG("DONE, generate mip maps = %i\n", This->dirty_mip);
|
||||
return D3D_OK;
|
||||
}
|
||||
|
|
|
@ -1737,7 +1737,7 @@ nine_ff_get_ps(struct NineDevice9 *device)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!context->texture[s] &&
|
||||
if (!context->texture[s].enabled &&
|
||||
((context->ff.tex_stage[s][D3DTSS_COLORARG0] == D3DTA_TEXTURE &&
|
||||
used_c & 0x1) ||
|
||||
(context->ff.tex_stage[s][D3DTSS_COLORARG1] == D3DTA_TEXTURE &&
|
||||
|
@ -1782,8 +1782,8 @@ nine_ff_get_ps(struct NineDevice9 *device)
|
|||
}
|
||||
key.ts[s].resultarg = context->ff.tex_stage[s][D3DTSS_RESULTARG] == D3DTA_TEMP;
|
||||
|
||||
if (context->texture[s]) {
|
||||
switch (context->texture[s]->base.type) {
|
||||
if (context->texture[s].enabled) {
|
||||
switch (context->texture[s].type) {
|
||||
case D3DRTYPE_TEXTURE: key.ts[s].textarget = 1; break;
|
||||
case D3DRTYPE_VOLUMETEXTURE: key.ts[s].textarget = 2; break;
|
||||
case D3DRTYPE_CUBETEXTURE: key.ts[s].textarget = 3; break;
|
||||
|
|
|
@ -656,20 +656,20 @@ update_sampler_derived(struct nine_context *context, unsigned s)
|
|||
{
|
||||
boolean changed = FALSE;
|
||||
|
||||
if (context->samp[s][NINED3DSAMP_SHADOW] != context->texture[s]->shadow) {
|
||||
if (context->samp[s][NINED3DSAMP_SHADOW] != context->texture[s].shadow) {
|
||||
changed = TRUE;
|
||||
context->samp[s][NINED3DSAMP_SHADOW] = context->texture[s]->shadow;
|
||||
context->samp[s][NINED3DSAMP_SHADOW] = context->texture[s].shadow;
|
||||
}
|
||||
|
||||
if (context->samp[s][NINED3DSAMP_CUBETEX] !=
|
||||
(NineResource9(context->texture[s])->type == D3DRTYPE_CUBETEXTURE)) {
|
||||
(context->texture[s].type == D3DRTYPE_CUBETEXTURE)) {
|
||||
changed = TRUE;
|
||||
context->samp[s][NINED3DSAMP_CUBETEX] =
|
||||
NineResource9(context->texture[s])->type == D3DRTYPE_CUBETEXTURE;
|
||||
context->texture[s].type == D3DRTYPE_CUBETEXTURE;
|
||||
}
|
||||
|
||||
if (context->samp[s][D3DSAMP_MIPFILTER] != D3DTEXF_NONE) {
|
||||
int lod = context->samp[s][D3DSAMP_MAXMIPLEVEL] - context->texture[s]->managed.lod;
|
||||
int lod = context->samp[s][D3DSAMP_MAXMIPLEVEL] - context->texture[s].lod;
|
||||
if (lod < 0)
|
||||
lod = 0;
|
||||
if (context->samp[s][NINED3DSAMP_MINLOD] != lod) {
|
||||
|
@ -703,15 +703,15 @@ update_textures_and_samplers(struct NineDevice9 *device)
|
|||
const unsigned s = NINE_SAMPLER_PS(i);
|
||||
int sRGB;
|
||||
|
||||
if (!context->texture[s] && !(sampler_mask & (1 << i))) {
|
||||
if (!context->texture[s].enabled && !(sampler_mask & (1 << i))) {
|
||||
view[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (context->texture[s]) {
|
||||
if (context->texture[s].enabled) {
|
||||
sRGB = context->samp[s][D3DSAMP_SRGBTEXTURE] ? 1 : 0;
|
||||
|
||||
view[i] = NineBaseTexture9_GetSamplerView(context->texture[s], sRGB);
|
||||
view[i] = context->texture[s].view[sRGB];
|
||||
num_textures = i + 1;
|
||||
|
||||
if (update_sampler_derived(context, s) || (context->changed.sampler[s] & 0x05fe)) {
|
||||
|
@ -751,15 +751,15 @@ update_textures_and_samplers(struct NineDevice9 *device)
|
|||
const unsigned s = NINE_SAMPLER_VS(i);
|
||||
int sRGB;
|
||||
|
||||
if (!context->texture[s] && !(sampler_mask & (1 << i))) {
|
||||
if (!context->texture[s].enabled && !(sampler_mask & (1 << i))) {
|
||||
view[i] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (context->texture[s]) {
|
||||
if (context->texture[s].enabled) {
|
||||
sRGB = context->samp[s][D3DSAMP_SRGBTEXTURE] ? 1 : 0;
|
||||
|
||||
view[i] = NineBaseTexture9_GetSamplerView(context->texture[s], sRGB);
|
||||
view[i] = context->texture[s].view[sRGB];
|
||||
num_textures = i + 1;
|
||||
|
||||
if (update_sampler_derived(context, s) || (context->changed.sampler[s] & 0x05fe)) {
|
||||
|
@ -1043,18 +1043,17 @@ NineDevice9_ResolveZ( struct NineDevice9 *device )
|
|||
struct nine_context *context = &device->context;
|
||||
const struct util_format_description *desc;
|
||||
struct NineSurface9 *source = context->ds;
|
||||
struct NineBaseTexture9 *destination = context->texture[0];
|
||||
struct pipe_resource *src, *dst;
|
||||
struct pipe_blit_info blit;
|
||||
|
||||
DBG("RESZ resolve\n");
|
||||
|
||||
if (!source || !destination ||
|
||||
destination->base.type != D3DRTYPE_TEXTURE)
|
||||
if (!source || !context->texture[0].enabled ||
|
||||
context->texture[0].type != D3DRTYPE_TEXTURE)
|
||||
return;
|
||||
|
||||
src = source->base.resource;
|
||||
dst = destination->base.resource;
|
||||
dst = context->texture[0].resource;
|
||||
|
||||
if (!src || !dst)
|
||||
return;
|
||||
|
@ -1146,10 +1145,31 @@ nine_context_set_texture(struct NineDevice9 *device,
|
|||
struct nine_context *context = &device->context;
|
||||
|
||||
context->samplers_shadow &= ~(1 << Stage);
|
||||
if (tex)
|
||||
/* For managed pool, the data can be initially incomplete.
|
||||
* In that case, the texture is rebound later
|
||||
* (in NineBaseTexture9_Validate/NineBaseTexture9_UploadSelf). */
|
||||
if (tex && tex->base.resource) {
|
||||
context->samplers_shadow |= tex->shadow << Stage;
|
||||
|
||||
nine_bind(&context->texture[Stage], tex);
|
||||
context->texture[Stage].enabled = TRUE;
|
||||
context->texture[Stage].shadow = tex->shadow;
|
||||
context->texture[Stage].lod = tex->managed.lod;
|
||||
context->texture[Stage].type = tex->base.type;
|
||||
context->texture[Stage].pstype = tex->pstype;
|
||||
pipe_resource_reference(&context->texture[Stage].resource,
|
||||
tex->base.resource);
|
||||
pipe_sampler_view_reference(&context->texture[Stage].view[0],
|
||||
NineBaseTexture9_GetSamplerView(tex, 0));
|
||||
pipe_sampler_view_reference(&context->texture[Stage].view[1],
|
||||
NineBaseTexture9_GetSamplerView(tex, 1));
|
||||
} else {
|
||||
context->texture[Stage].enabled = FALSE;
|
||||
pipe_resource_reference(&context->texture[Stage].resource,
|
||||
NULL);
|
||||
pipe_sampler_view_reference(&context->texture[Stage].view[0],
|
||||
NULL);
|
||||
pipe_sampler_view_reference(&context->texture[Stage].view[1],
|
||||
NULL);
|
||||
}
|
||||
|
||||
context->changed.group |= NINE_STATE_TEXTURE;
|
||||
}
|
||||
|
@ -1601,15 +1621,11 @@ nine_context_apply_stateblock(struct NineDevice9 *device,
|
|||
uint32_t m = src->changed.texture;
|
||||
unsigned s;
|
||||
|
||||
context->samplers_shadow &= ~m;
|
||||
|
||||
for (s = 0; m; ++s, m >>= 1) {
|
||||
struct NineBaseTexture9 *tex = src->texture[s];
|
||||
if (!(m & 1))
|
||||
continue;
|
||||
if (tex)
|
||||
context->samplers_shadow |= tex->shadow << s;
|
||||
nine_bind(&context->texture[s], src->texture[s]);
|
||||
nine_context_set_texture(device, s, tex);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2424,8 +2440,15 @@ nine_context_clear(struct NineDevice9 *device)
|
|||
pipe_resource_reference(&context->vtxbuf[i].buffer, NULL);
|
||||
pipe_resource_reference(&context->idxbuf.buffer, NULL);
|
||||
|
||||
for (i = 0; i < NINE_MAX_SAMPLERS; ++i)
|
||||
nine_bind(&context->texture[i], NULL);
|
||||
for (i = 0; i < NINE_MAX_SAMPLERS; ++i) {
|
||||
context->texture[i].enabled = FALSE;
|
||||
pipe_resource_reference(&context->texture[i].resource,
|
||||
NULL);
|
||||
pipe_sampler_view_reference(&context->texture[i].view[0],
|
||||
NULL);
|
||||
pipe_sampler_view_reference(&context->texture[i].view[1],
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -277,7 +277,15 @@ struct nine_context {
|
|||
|
||||
DWORD rs[NINED3DRS_COUNT];
|
||||
|
||||
struct NineBaseTexture9 *texture[NINE_MAX_SAMPLERS];
|
||||
struct {
|
||||
BOOL enabled;
|
||||
BOOL shadow;
|
||||
DWORD lod;
|
||||
D3DRESOURCETYPE type;
|
||||
struct pipe_resource *resource;
|
||||
struct pipe_sampler_view *view[2];
|
||||
uint8_t pstype;
|
||||
} texture[NINE_MAX_SAMPLERS];
|
||||
|
||||
DWORD samp[NINE_MAX_SAMPLERS][NINED3DSAMP_COUNT];
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ NinePixelShader9_UpdateKey( struct NinePixelShader9 *ps,
|
|||
while (m) {
|
||||
int s = ffs(m) - 1;
|
||||
m &= ~(1 << s);
|
||||
samplers_ps1_types |= (context->texture[s] ? context->texture[s]->pstype : 1) << (s * 2);
|
||||
samplers_ps1_types |= (context->texture[s].enabled ? context->texture[s].pstype : 1) << (s * 2);
|
||||
}
|
||||
key = samplers_ps1_types;
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue