13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 27b911688b87a011eacf2034bd61562e633952a66bKeith Whitwell#include "svga_debug.h" 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_pack_color.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_surface.h" 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic enum pipe_error 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztry_clear(struct svga_context *svga, 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned buffers, 406dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz double depth, 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned stencil) 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 445f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul enum pipe_error ret = PIPE_OK; 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dRect rect = { 0, 0, 0, 0 }; 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz boolean restore_viewport = FALSE; 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dClearFlag flags = 0; 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_framebuffer_state *fb = &svga->curr.framebuffer; 491e5dc6a7788f4c548fbed38813090978fdacd984Marek Olšák union util_color uc = {0}; 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = svga_update_state(svga, SVGA_STATE_HW_CLEAR); 525f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 556b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca if (svga->rebind.rendertargets) { 566b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca ret = svga_reemit_framebuffer_bindings(svga); 576b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca if (ret != PIPE_OK) { 586b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca return ret; 596b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca } 606b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca } 616b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if ((buffers & PIPE_CLEAR_COLOR) && fb->cbufs[0]) { 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz flags |= SVGA3D_CLEAR_COLOR; 646dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie util_pack_color(color->f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rect.w = fb->cbufs[0]->width; 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rect.h = fb->cbufs[0]->height; 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && fb->zsbuf) { 71d1998962efe9069c6cafe6c59f62f0590586d4a6Roland Scheidegger if (buffers & PIPE_CLEAR_DEPTH) 72d1998962efe9069c6cafe6c59f62f0590586d4a6Roland Scheidegger flags |= SVGA3D_CLEAR_DEPTH; 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 74866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie if ((svga->curr.framebuffer.zsbuf->format == PIPE_FORMAT_S8_UINT_Z24_UNORM) && 75d1998962efe9069c6cafe6c59f62f0590586d4a6Roland Scheidegger (buffers & PIPE_CLEAR_STENCIL)) 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz flags |= SVGA3D_CLEAR_STENCIL; 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rect.w = MAX2(rect.w, fb->zsbuf->width); 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rect.h = MAX2(rect.h, fb->zsbuf->height); 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (memcmp(&rect, &svga->state.hw_clear.viewport, sizeof(rect)) != 0) { 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz restore_viewport = TRUE; 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_SetViewport(svga->swc, &rect); 855f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 893456f9149b3009fcfce80054759d05883d3c4ee5Roland Scheidegger ret = SVGA3D_ClearRect(svga->swc, flags, uc.ui, depth, stencil, 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz rect.x, rect.y, rect.w, rect.h); 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret != PIPE_OK) 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (restore_viewport) { 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memcpy(&rect, &svga->state.hw_clear.viewport, sizeof rect); 963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = SVGA3D_SetViewport(svga->swc, &rect); 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return ret; 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/** 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Clear the given surface to the specified value. 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * No masking, no scissor (clear entire buffer). 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid 1076dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airliesvga_clear(struct pipe_context *pipe, unsigned buffers, 1086dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz double depth, unsigned stencil) 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context( pipe ); 1125f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul enum pipe_error ret; 113d1998962efe9069c6cafe6c59f62f0590586d4a6Roland Scheidegger 114b911688b87a011eacf2034bd61562e633952a66bKeith Whitwell if (buffers & PIPE_CLEAR_COLOR) 115b911688b87a011eacf2034bd61562e633952a66bKeith Whitwell SVGA_DBG(DEBUG_DMA, "clear sid %p\n", 116b911688b87a011eacf2034bd61562e633952a66bKeith Whitwell svga_surface(svga->curr.framebuffer.cbufs[0])->handle); 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1188ec18dfc1af43ef1f74c3f28c87e11da815f1958Brian Paul /* flush any queued prims (don't want them to appear after the clear!) */ 1198ec18dfc1af43ef1f74c3f28c87e11da815f1958Brian Paul svga_hwtnl_flush_retry(svga); 1208ec18dfc1af43ef1f74c3f28c87e11da815f1958Brian Paul 1216dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ret = try_clear( svga, buffers, color, depth, stencil ); 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret == PIPE_ERROR_OUT_OF_MEMORY) { 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Flush command buffer and retry: 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush( svga, NULL ); 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1286dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie ret = try_clear( svga, buffers, color, depth, stencil ); 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Mark target surfaces as dirty 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * TODO Mark only cleared surfaces. 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_mark_surfaces_dirty(svga); 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert (ret == PIPE_OK); 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 139