mirror of https://github.com/xemu-project/xemu.git
nv2a: Fix stale texture in surface input and output case
This commit is contained in:
parent
f375a0cb80
commit
b0f20c9bba
|
@ -2796,6 +2796,14 @@ DEF_METHOD(NV097, SET_BEGIN_END)
|
||||||
glEndQuery(GL_SAMPLES_PASSED);
|
glEndQuery(GL_SAMPLES_PASSED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pg->draw_time++;
|
||||||
|
if (pg->color_binding && pgraph_color_write_enabled(pg)) {
|
||||||
|
pg->color_binding->draw_time = pg->draw_time;
|
||||||
|
}
|
||||||
|
if (pg->zeta_binding && pgraph_zeta_write_enabled(pg)) {
|
||||||
|
pg->zeta_binding->draw_time = pg->draw_time;
|
||||||
|
}
|
||||||
|
|
||||||
NV2A_GL_DGROUP_END();
|
NV2A_GL_DGROUP_END();
|
||||||
} else {
|
} else {
|
||||||
NV2A_GL_DGROUP_BEGIN("NV097_SET_BEGIN_END: 0x%x", parameter);
|
NV2A_GL_DGROUP_BEGIN("NV097_SET_BEGIN_END: 0x%x", parameter);
|
||||||
|
@ -6160,7 +6168,32 @@ static void pgraph_bind_textures(NV2AState *d)
|
||||||
|
|
||||||
nv2a_profile_inc_counter(NV2A_PROF_TEX_BIND);
|
nv2a_profile_inc_counter(NV2A_PROF_TEX_BIND);
|
||||||
|
|
||||||
if (!pg->texture_dirty[i] && pg->texture_binding[i]) {
|
hwaddr dma_len;
|
||||||
|
uint8_t *texture_data;
|
||||||
|
if (dma_select) {
|
||||||
|
texture_data = (uint8_t*)nv_dma_map(d, pg->dma_b, &dma_len);
|
||||||
|
} else {
|
||||||
|
texture_data = (uint8_t*)nv_dma_map(d, pg->dma_a, &dma_len);
|
||||||
|
}
|
||||||
|
assert(offset < dma_len);
|
||||||
|
texture_data += offset;
|
||||||
|
hwaddr texture_vram_offset = texture_data - d->vram_ptr;
|
||||||
|
|
||||||
|
hwaddr palette_dma_len;
|
||||||
|
uint8_t *palette_data;
|
||||||
|
if (palette_dma_select) {
|
||||||
|
palette_data = (uint8_t*)nv_dma_map(d, pg->dma_b, &palette_dma_len);
|
||||||
|
} else {
|
||||||
|
palette_data = (uint8_t*)nv_dma_map(d, pg->dma_a, &palette_dma_len);
|
||||||
|
}
|
||||||
|
assert(palette_offset < palette_dma_len);
|
||||||
|
palette_data += palette_offset;
|
||||||
|
hwaddr palette_vram_offset = palette_data - d->vram_ptr;
|
||||||
|
|
||||||
|
SurfaceBinding *surface = pgraph_surface_get(d, texture_vram_offset);
|
||||||
|
TextureBinding *tbind = pg->texture_binding[i];
|
||||||
|
if (!pg->texture_dirty[i] && tbind &&
|
||||||
|
(!surface || tbind->draw_time == surface->draw_time)) {
|
||||||
glBindTexture(pg->texture_binding[i]->gl_target,
|
glBindTexture(pg->texture_binding[i]->gl_target,
|
||||||
pg->texture_binding[i]->gl_texture);
|
pg->texture_binding[i]->gl_texture);
|
||||||
continue;
|
continue;
|
||||||
|
@ -6243,28 +6276,6 @@ static void pgraph_bind_textures(NV2AState *d)
|
||||||
assert(levels > 0);
|
assert(levels > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
hwaddr dma_len;
|
|
||||||
uint8_t *texture_data;
|
|
||||||
if (dma_select) {
|
|
||||||
texture_data = (uint8_t*)nv_dma_map(d, pg->dma_b, &dma_len);
|
|
||||||
} else {
|
|
||||||
texture_data = (uint8_t*)nv_dma_map(d, pg->dma_a, &dma_len);
|
|
||||||
}
|
|
||||||
assert(offset < dma_len);
|
|
||||||
texture_data += offset;
|
|
||||||
hwaddr texture_vram_offset = texture_data - d->vram_ptr;
|
|
||||||
|
|
||||||
hwaddr palette_dma_len;
|
|
||||||
uint8_t *palette_data;
|
|
||||||
if (palette_dma_select) {
|
|
||||||
palette_data = (uint8_t*)nv_dma_map(d, pg->dma_b, &palette_dma_len);
|
|
||||||
} else {
|
|
||||||
palette_data = (uint8_t*)nv_dma_map(d, pg->dma_a, &palette_dma_len);
|
|
||||||
}
|
|
||||||
assert(palette_offset < palette_dma_len);
|
|
||||||
palette_data += palette_offset;
|
|
||||||
hwaddr palette_vram_offset = palette_data - d->vram_ptr;
|
|
||||||
|
|
||||||
size_t length = 0;
|
size_t length = 0;
|
||||||
if (f.linear) {
|
if (f.linear) {
|
||||||
assert(cubemap == false);
|
assert(cubemap == false);
|
||||||
|
@ -6329,7 +6340,6 @@ static void pgraph_bind_textures(NV2AState *d)
|
||||||
* Check active surfaces to see if this texture was a render target
|
* Check active surfaces to see if this texture was a render target
|
||||||
*/
|
*/
|
||||||
bool surf_to_tex = false;
|
bool surf_to_tex = false;
|
||||||
SurfaceBinding *surface = pgraph_surface_get(d, texture_vram_offset);
|
|
||||||
if (surface != NULL) {
|
if (surface != NULL) {
|
||||||
surf_to_tex = pgraph_check_surface_to_texture_compatibility(
|
surf_to_tex = pgraph_check_surface_to_texture_compatibility(
|
||||||
surface, &state);
|
surface, &state);
|
||||||
|
@ -6424,7 +6434,8 @@ static void pgraph_bind_textures(NV2AState *d)
|
||||||
TextureBinding *binding = key_out->binding;
|
TextureBinding *binding = key_out->binding;
|
||||||
binding->refcnt++;
|
binding->refcnt++;
|
||||||
|
|
||||||
if (surf_to_tex && (binding->draw_time < surface->draw_time)) {
|
if (surf_to_tex && binding->draw_time < surface->draw_time) {
|
||||||
|
|
||||||
NV2A_XPRINTF(DBG_SURFACES,
|
NV2A_XPRINTF(DBG_SURFACES,
|
||||||
"Rendering surface @ %" HWADDR_PRIx " to texture (%dx%d)\n",
|
"Rendering surface @ %" HWADDR_PRIx " to texture (%dx%d)\n",
|
||||||
surface->vram_addr, surface->width, surface->height);
|
surface->vram_addr, surface->width, surface->height);
|
||||||
|
|
Loading…
Reference in New Issue