svga: Re-emit bound rendertargets and texture samplers at the beginning of every command buffer.
Only non null resources. To ensure that relocations are emitted for every resource currently referred.
This commit is contained in:
@@ -214,6 +214,11 @@ void svga_context_flush( struct svga_context *svga,
|
||||
|
||||
svga_screen_cache_flush(svgascreen, fence);
|
||||
|
||||
/* To force the reemission of rendertargets and texture bindings at
|
||||
* the beginning of every command buffer.
|
||||
*/
|
||||
svga->dirty |= SVGA_NEW_COMMAND_BUFFER;
|
||||
|
||||
if (SVGA_DEBUG & DEBUG_SYNC) {
|
||||
if (fence)
|
||||
svga->pipe.screen->fence_finish( svga->pipe.screen, fence, 0);
|
||||
|
||||
@@ -382,6 +382,7 @@ struct svga_context
|
||||
#define SVGA_NEW_ZERO_STRIDE 0x2000000
|
||||
#define SVGA_NEW_TEXTURE_FLAGS 0x4000000
|
||||
#define SVGA_NEW_STENCIL_REF 0x8000000
|
||||
#define SVGA_NEW_COMMAND_BUFFER 0x10000000
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -43,15 +43,18 @@ static int emit_framebuffer( struct svga_context *svga,
|
||||
{
|
||||
const struct pipe_framebuffer_state *curr = &svga->curr.framebuffer;
|
||||
struct pipe_framebuffer_state *hw = &svga->state.hw_clear.framebuffer;
|
||||
boolean reemit = !!(dirty & SVGA_NEW_COMMAND_BUFFER);
|
||||
unsigned i;
|
||||
enum pipe_error ret;
|
||||
|
||||
/* XXX: Need shadow state in svga->hw to eliminate redundant
|
||||
* uploads, especially of NULL buffers.
|
||||
/*
|
||||
* We need to reemit non-null surface bindings, even when they are not
|
||||
* dirty, to ensure that the resources are paged in.
|
||||
*/
|
||||
|
||||
for(i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) {
|
||||
if (curr->cbufs[i] != hw->cbufs[i]) {
|
||||
if (curr->cbufs[i] != hw->cbufs[i] ||
|
||||
(reemit && hw->cbufs[i])) {
|
||||
if (svga->curr.nr_fbs++ > 8)
|
||||
return PIPE_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
@@ -64,7 +67,8 @@ static int emit_framebuffer( struct svga_context *svga,
|
||||
}
|
||||
|
||||
|
||||
if (curr->zsbuf != hw->zsbuf) {
|
||||
if (curr->zsbuf != hw->zsbuf ||
|
||||
(reemit && hw->zsbuf)) {
|
||||
ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_DEPTH, curr->zsbuf);
|
||||
if (ret != PIPE_OK)
|
||||
return ret;
|
||||
@@ -92,7 +96,8 @@ static int emit_framebuffer( struct svga_context *svga,
|
||||
struct svga_tracked_state svga_hw_framebuffer =
|
||||
{
|
||||
"hw framebuffer state",
|
||||
SVGA_NEW_FRAME_BUFFER,
|
||||
SVGA_NEW_FRAME_BUFFER |
|
||||
SVGA_NEW_COMMAND_BUFFER,
|
||||
emit_framebuffer
|
||||
};
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@ static int
|
||||
update_tss_binding(struct svga_context *svga,
|
||||
unsigned dirty )
|
||||
{
|
||||
boolean reemit = !!(dirty & SVGA_NEW_COMMAND_BUFFER);
|
||||
unsigned i;
|
||||
unsigned count = MAX2( svga->curr.num_sampler_views,
|
||||
svga->state.hw_draw.num_views );
|
||||
@@ -107,12 +108,18 @@ update_tss_binding(struct svga_context *svga,
|
||||
max_lod);
|
||||
}
|
||||
|
||||
if (view->dirty) {
|
||||
/*
|
||||
* We need to reemit non-null texture bindings, even when they are not
|
||||
* dirty, to ensure that the resources are paged in.
|
||||
*/
|
||||
|
||||
if (view->dirty ||
|
||||
(reemit && view->v)) {
|
||||
queue.bind[queue.bind_count].unit = i;
|
||||
queue.bind[queue.bind_count].view = view;
|
||||
queue.bind_count++;
|
||||
}
|
||||
else if (view->v) {
|
||||
if (!view->dirty && view->v) {
|
||||
svga_validate_sampler_view(svga, view->v);
|
||||
}
|
||||
}
|
||||
@@ -160,7 +167,8 @@ fail:
|
||||
struct svga_tracked_state svga_hw_tss_binding = {
|
||||
"texture binding emit",
|
||||
SVGA_NEW_TEXTURE_BINDING |
|
||||
SVGA_NEW_SAMPLER,
|
||||
SVGA_NEW_SAMPLER |
|
||||
SVGA_NEW_COMMAND_BUFFER,
|
||||
update_tss_binding
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user