X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_pipe_clear.c;h=c4edced9baed7249fc367f414f27edc6f82b94d8;hb=be0a994fb8689131bf6a717c1e6fa5a42c3d4657;hp=6195c3897ed2bb764fddc3d282064afd3b05e372;hpb=b605f4ff11c894500f2d0273c5d4653ff413448d;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_pipe_clear.c b/src/gallium/drivers/svga/svga_pipe_clear.c index 6195c3897ed..c4edced9bae 100644 --- a/src/gallium/drivers/svga/svga_pipe_clear.c +++ b/src/gallium/drivers/svga/svga_pipe_clear.c @@ -31,39 +31,48 @@ #include "svga_context.h" #include "svga_state.h" -#include "svga_screen_texture.h" +#include "svga_surface.h" static enum pipe_error try_clear(struct svga_context *svga, unsigned buffers, - const float *rgba, + const union pipe_color_union *color, double depth, unsigned stencil) { - int ret = PIPE_OK; + enum pipe_error ret = PIPE_OK; SVGA3dRect rect = { 0, 0, 0, 0 }; boolean restore_viewport = FALSE; SVGA3dClearFlag flags = 0; struct pipe_framebuffer_state *fb = &svga->curr.framebuffer; - unsigned color = 0; + union util_color uc = {0}; ret = svga_update_state(svga, SVGA_STATE_HW_CLEAR); - if (ret) + if (ret != PIPE_OK) return ret; - if ((buffers & PIPE_CLEAR_COLOR) && fb->cbufs[0]) { + if (svga->rebind.rendertargets) { + ret = svga_reemit_framebuffer_bindings(svga); + if (ret != PIPE_OK) { + return ret; + } + } + + if (buffers & PIPE_CLEAR_COLOR) { flags |= SVGA3D_CLEAR_COLOR; - util_pack_color(rgba, PIPE_FORMAT_A8R8G8B8_UNORM, &color); + util_pack_color(color->f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); - rect.w = fb->cbufs[0]->width; - rect.h = fb->cbufs[0]->height; + rect.w = fb->width; + rect.h = fb->height; } if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && fb->zsbuf) { - flags |= SVGA3D_CLEAR_DEPTH; + if (buffers & PIPE_CLEAR_DEPTH) + flags |= SVGA3D_CLEAR_DEPTH; - if (svga->curr.framebuffer.zsbuf->format == PIPE_FORMAT_Z24S8_UNORM) + if ((svga->curr.framebuffer.zsbuf->format == PIPE_FORMAT_S8_UINT_Z24_UNORM) && + (buffers & PIPE_CLEAR_STENCIL)) flags |= SVGA3D_CLEAR_STENCIL; rect.w = MAX2(rect.w, fb->zsbuf->width); @@ -73,11 +82,11 @@ try_clear(struct svga_context *svga, if (memcmp(&rect, &svga->state.hw_clear.viewport, sizeof(rect)) != 0) { restore_viewport = TRUE; ret = SVGA3D_SetViewport(svga->swc, &rect); - if (ret) + if (ret != PIPE_OK) return ret; } - ret = SVGA3D_ClearRect(svga->swc, flags, color, depth, stencil, + ret = SVGA3D_ClearRect(svga->swc, flags, uc.ui[0], (float) depth, stencil, rect.x, rect.y, rect.w, rect.h); if (ret != PIPE_OK) return ret; @@ -95,24 +104,32 @@ try_clear(struct svga_context *svga, * No masking, no scissor (clear entire buffer). */ void -svga_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba, +svga_clear(struct pipe_context *pipe, unsigned buffers, + const union pipe_color_union *color, double depth, unsigned stencil) { struct svga_context *svga = svga_context( pipe ); - int ret; - - if (buffers & PIPE_CLEAR_COLOR) - SVGA_DBG(DEBUG_DMA, "clear sid %p\n", - svga_surface(svga->curr.framebuffer.cbufs[0])->handle); + enum pipe_error ret; + + if (buffers & PIPE_CLEAR_COLOR) { + struct svga_winsys_surface *h = NULL; + if (svga->curr.framebuffer.cbufs[0]) { + h = svga_surface(svga->curr.framebuffer.cbufs[0])->handle; + } + SVGA_DBG(DEBUG_DMA, "clear sid %p\n", h); + } + + /* flush any queued prims (don't want them to appear after the clear!) */ + svga_hwtnl_flush_retry(svga); - ret = try_clear( svga, buffers, rgba, depth, stencil ); + ret = try_clear( svga, buffers, color, depth, stencil ); if (ret == PIPE_ERROR_OUT_OF_MEMORY) { /* Flush command buffer and retry: */ svga_context_flush( svga, NULL ); - ret = try_clear( svga, buffers, rgba, depth, stencil ); + ret = try_clear( svga, buffers, color, depth, stencil ); } /*