13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/************************************************************************** 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved. 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * "Software"), to deal in the Software without restriction, including 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * permit persons to whom the Software is furnished to do so, subject to 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the following conditions: 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * next paragraph) shall be included in all copies or substantial portions 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software. 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/ 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Authors: Keith Whitwell <keith@tungstengraphics.com> 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "sp_context.h" 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "sp_state.h" 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "sp_tile_cache.h" 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "draw/draw_context.h" 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 37760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_format.h" 38760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "util/u_inlines.h" 39760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * XXX this might get moved someday 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Set the framebuffer surface info: color buffers, zbuffer, stencil buffer. 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Here, we flush the old surfaces and update the tile cache to point to the new 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * surfaces. 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgsoftpipe_set_framebuffer_state(struct pipe_context *pipe, 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const struct pipe_framebuffer_state *fb) 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct softpipe_context *sp = softpipe_context(pipe); 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org uint i; 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 54760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org draw_flush(sp->draw); 55760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* check if changing cbuf */ 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (sp->framebuffer.cbufs[i] != fb->cbufs[i]) { 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* flush old */ 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp_flush_tile_cache(sp->cbuf_cache[i]); 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* assign new */ 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pipe_surface_reference(&sp->framebuffer.cbufs[i], fb->cbufs[i]); 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* update cache */ 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp_tile_cache_set_surface(sp->cbuf_cache[i], fb->cbufs[i]); 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp->framebuffer.nr_cbufs = fb->nr_cbufs; 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* zbuf changing? */ 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (sp->framebuffer.zsbuf != fb->zsbuf) { 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* flush old */ 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp_flush_tile_cache(sp->zsbuf_cache); 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* assign new */ 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pipe_surface_reference(&sp->framebuffer.zsbuf, fb->zsbuf); 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* update cache */ 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp_tile_cache_set_surface(sp->zsbuf_cache, fb->zsbuf); 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* Tell draw module how deep the Z/depth buffer is */ 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (sp->framebuffer.zsbuf) { 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org int depth_bits; 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org double mrd; 87760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org depth_bits = util_format_get_component_bits(sp->framebuffer.zsbuf->format, 88760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org UTIL_FORMAT_COLORSPACE_ZS, 89760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 0); 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (depth_bits > 16) { 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org mrd = 0.0000001; 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org mrd = 0.00002; 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org draw_set_mrd(sp->draw, mrd); 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp->framebuffer.width = fb->width; 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp->framebuffer.height = fb->height; 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org sp->dirty |= SP_NEW_FRAMEBUFFER; 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 105