17301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver/********************************************************** 27301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * Copyright 2008-2009 VMware, Inc. All rights reserved. 37301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * 47301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * Permission is hereby granted, free of charge, to any person 57301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * obtaining a copy of this software and associated documentation 67301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * files (the "Software"), to deal in the Software without 77301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * restriction, including without limitation the rights to use, copy, 87301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * modify, merge, publish, distribute, sublicense, and/or sell copies 97301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * of the Software, and to permit persons to whom the Software is 107301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * furnished to do so, subject to the following conditions: 117301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * 127301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * The above copyright notice and this permission notice shall be 137301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * included in all copies or substantial portions of the Software. 147301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * 157301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 167301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 177301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 187301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 197301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 207301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 217301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 227301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * SOFTWARE. 237301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * 247301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver **********************************************************/ 257301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 267301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver#include "svga_cmd.h" 277301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver#include "svga_debug.h" 287301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 297301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver#include "pipe/p_defines.h" 307301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver#include "util/u_pack_color.h" 317301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 327301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver#include "svga_context.h" 337301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver#include "svga_state.h" 347301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver#include "svga_surface.h" 357301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 367301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 377301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruverstatic enum pipe_error 387301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruvertry_clear(struct svga_context *svga, 397301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver unsigned buffers, 407301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver const union pipe_color_union *color, 417301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver double depth, 427301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver unsigned stencil) 437301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver{ 447301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver enum pipe_error ret = PIPE_OK; 457301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver SVGA3dRect rect = { 0, 0, 0, 0 }; 467301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver boolean restore_viewport = FALSE; 477301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver SVGA3dClearFlag flags = 0; 487301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver struct pipe_framebuffer_state *fb = &svga->curr.framebuffer; 497301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver union util_color uc = {0}; 507301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 517301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ret = svga_update_state(svga, SVGA_STATE_HW_CLEAR); 527301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (ret != PIPE_OK) 537301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return ret; 547301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 557301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (svga->rebind.rendertargets) { 567301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ret = svga_reemit_framebuffer_bindings(svga); 577301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (ret != PIPE_OK) { 587301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return ret; 597301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 607301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 617301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 627301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if ((buffers & PIPE_CLEAR_COLOR) && fb->cbufs[0]) { 637301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver flags |= SVGA3D_CLEAR_COLOR; 647301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver util_pack_color(color->f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 657301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 667301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver rect.w = fb->cbufs[0]->width; 677301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver rect.h = fb->cbufs[0]->height; 687301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 697301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 707301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && fb->zsbuf) { 717301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (buffers & PIPE_CLEAR_DEPTH) 727301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver flags |= SVGA3D_CLEAR_DEPTH; 737301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 747301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if ((svga->curr.framebuffer.zsbuf->format == PIPE_FORMAT_S8_UINT_Z24_UNORM) && 757301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver (buffers & PIPE_CLEAR_STENCIL)) 767301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver flags |= SVGA3D_CLEAR_STENCIL; 777301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 787301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver rect.w = MAX2(rect.w, fb->zsbuf->width); 797301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver rect.h = MAX2(rect.h, fb->zsbuf->height); 807301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 817301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 827301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (memcmp(&rect, &svga->state.hw_clear.viewport, sizeof(rect)) != 0) { 837301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver restore_viewport = TRUE; 847301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ret = SVGA3D_SetViewport(svga->swc, &rect); 857301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (ret != PIPE_OK) 867301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return ret; 877301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 887301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 897301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ret = SVGA3D_ClearRect(svga->swc, flags, uc.ui, depth, stencil, 907301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver rect.x, rect.y, rect.w, rect.h); 917301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (ret != PIPE_OK) 927301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return ret; 937301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 947301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver if (restore_viewport) { 957301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver memcpy(&rect, &svga->state.hw_clear.viewport, sizeof rect); 967301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver ret = SVGA3D_SetViewport(svga->swc, &rect); 977301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver } 987301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 997301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver return ret; 1007301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver} 1017301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver 1027301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver/** 1037301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * Clear the given surface to the specified value. 1047301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver * No masking, no scissor (clear entire buffer). 1057301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver */ 1067301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruvervoid 1077301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruversvga_clear(struct pipe_context *pipe, unsigned buffers, 1087301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver const union pipe_color_union *color, 1097301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver double depth, unsigned stencil) 1107301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver{ 1117301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver struct svga_context *svga = svga_context( pipe ); 1127301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver enum pipe_error ret; 113cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver 114cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver if (buffers & PIPE_CLEAR_COLOR) 115cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver SVGA_DBG(DEBUG_DMA, "clear sid %p\n", 116cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver svga_surface(svga->curr.framebuffer.cbufs[0])->handle); 117cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver 1187301fbe30e6661c67c33552efd28a8d7587aba3dBen Gruver /* flush any queued prims (don't want them to appear after the clear!) */ 119 svga_hwtnl_flush_retry(svga); 120 121 ret = try_clear( svga, buffers, color, depth, stencil ); 122 123 if (ret == PIPE_ERROR_OUT_OF_MEMORY) { 124 /* Flush command buffer and retry: 125 */ 126 svga_context_flush( svga, NULL ); 127 128 ret = try_clear( svga, buffers, color, depth, stencil ); 129 } 130 131 /* 132 * Mark target surfaces as dirty 133 * TODO Mark only cleared surfaces. 134 */ 135 svga_mark_surfaces_dirty(svga); 136 137 assert (ret == PIPE_OK); 138} 139