1d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz/************************************************************************** 2d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * 3d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * Copyright © 2010 Jakob Bornecrantz 4d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * 5d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a 6d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * copy of this software and associated documentation files (the "Software"), 7d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * to deal in the Software without restriction, including without limitation 8d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * and/or sell copies of the Software, and to permit persons to whom the 10d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * Software is furnished to do so, subject to the following conditions: 11d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * 12d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * The above copyright notice and this permission notice (including the next 13d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * paragraph) shall be included in all copies or substantial portions of the 14d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * Software. 15d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * 16d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * DEALINGS IN THE SOFTWARE. 23d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * 24d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz **************************************************************************/ 25d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz 26d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz 27d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz#include "i915_reg.h" 28d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz#include "i915_context.h" 29d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz#include "i915_state.h" 30beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter#include "i915_resource.h" 3111ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter#include "i915_screen.h" 32d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz 33d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz 34d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz/*********************************************************************** 35d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz * Update framebuffer state 36d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz */ 37beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetterstatic unsigned translate_format(enum pipe_format format) 38beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter{ 39beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter switch (format) { 40beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter case PIPE_FORMAT_B8G8R8A8_UNORM: 4145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin case PIPE_FORMAT_B8G8R8A8_SRGB: 421f3c5eae5c4be582e50c2d4d7950424d86059c45Vasily Khoruzhick case PIPE_FORMAT_B8G8R8X8_UNORM: 431f3c5eae5c4be582e50c2d4d7950424d86059c45Vasily Khoruzhick case PIPE_FORMAT_R8G8B8A8_UNORM: 441f3c5eae5c4be582e50c2d4d7950424d86059c45Vasily Khoruzhick case PIPE_FORMAT_R8G8B8X8_UNORM: 45beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter return COLOR_BUF_ARGB8888; 46beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter case PIPE_FORMAT_B5G6R5_UNORM: 47beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter return COLOR_BUF_RGB565; 482e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin case PIPE_FORMAT_B5G5R5A1_UNORM: 492e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin return COLOR_BUF_ARGB1555; 502e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin case PIPE_FORMAT_B4G4R4A4_UNORM: 512e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin return COLOR_BUF_ARGB4444; 522e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin case PIPE_FORMAT_B10G10R10A2_UNORM: 532e481e5fc4c99d353cc5b21dacf1470847a11646Stéphane Marchesin return COLOR_BUF_ARGB2101010; 54465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin case PIPE_FORMAT_L8_UNORM: 55465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin case PIPE_FORMAT_A8_UNORM: 56465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin case PIPE_FORMAT_I8_UNORM: 57465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin return COLOR_BUF_8BIT; 58beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter default: 59beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter assert(0); 60beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter return 0; 61beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter } 62beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter} 63beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 64beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetterstatic unsigned translate_depth_format(enum pipe_format zformat) 65beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter{ 66beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter switch (zformat) { 67beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter case PIPE_FORMAT_Z24X8_UNORM: 68866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 69beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter return DEPTH_FRMT_24_FIXED_8_OTHER; 70beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter case PIPE_FORMAT_Z16_UNORM: 71beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter return DEPTH_FRMT_16_FIXED; 72beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter default: 73beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter assert(0); 74beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter return 0; 75beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter } 76beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter} 77beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 78beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetterstatic inline uint32_t 79beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetterbuf_3d_tiling_bits(enum i915_winsys_buffer_tile tiling) 80beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter{ 81beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter uint32_t tiling_bits = 0; 82beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 83beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter switch (tiling) { 84beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter case I915_TILE_Y: 85beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter tiling_bits |= BUF_3D_TILE_WALK_Y; 86beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter case I915_TILE_X: 87beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter tiling_bits |= BUF_3D_TILED_SURFACE; 88beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter case I915_TILE_NONE: 89beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter break; 90beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter } 91beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 92beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter return tiling_bits; 93beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter} 94beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 95d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantzstatic void update_framebuffer(struct i915_context *i915) 96d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz{ 97beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter struct pipe_surface *cbuf_surface = i915->framebuffer.cbufs[0]; 98beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter struct pipe_surface *depth_surface = i915->framebuffer.zsbuf; 99288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter unsigned x, y; 100f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter int layer; 10111ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter uint32_t draw_offset, draw_size; 102beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 103beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter if (cbuf_surface) { 104beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter struct i915_texture *tex = i915_texture(cbuf_surface->texture); 105beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter assert(tex); 106beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 107beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter i915->current.cbuf_bo = tex->buffer; 108beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter i915->current.cbuf_flags = BUF_3D_ID_COLOR_BACK | 109beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter BUF_3D_PITCH(tex->stride) | /* pitch in bytes */ 110beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter buf_3d_tiling_bits(tex->tiling); 111f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter 112f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter layer = cbuf_surface->u.tex.first_layer; 113f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter 114f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter x = tex->image_offset[cbuf_surface->u.tex.level][layer].nblocksx; 115f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter y = tex->image_offset[cbuf_surface->u.tex.level][layer].nblocksy; 116beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter } else { 117beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter i915->current.cbuf_bo = NULL; 118f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter x = y = 0; 119beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter } 120288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter i915->static_dirty |= I915_DST_BUF_COLOR; 121beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 122beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter /* What happens if no zbuf?? 123d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz */ 124beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter if (depth_surface) { 125beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter struct i915_texture *tex = i915_texture(depth_surface->texture); 126beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter unsigned offset = i915_texture_offset(tex, depth_surface->u.tex.level, 127beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter depth_surface->u.tex.first_layer); 128beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter assert(tex); 1291981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin if (offset != 0) 1301981042341c6942bbd4d61508a47226c789bc25bStéphane Marchesin debug_printf("Depth offset is %d\n",offset); 131beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter 132beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter i915->current.depth_bo = tex->buffer; 133beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter i915->current.depth_flags = BUF_3D_ID_DEPTH | 134beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter BUF_3D_PITCH(tex->stride) | /* pitch in bytes */ 135beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter buf_3d_tiling_bits(tex->tiling); 13611ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter } else 137beaf039f972490bc62ec87401441d4b754ae86b0Daniel Vetter i915->current.depth_bo = NULL; 138288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter i915->static_dirty |= I915_DST_BUF_DEPTH; 139288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter 140f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter /* drawing rect calculations */ 141f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter draw_offset = x | (y << 16); 142288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter draw_size = (i915->framebuffer.width - 1 + x) | 143288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter ((i915->framebuffer.height - 1 + y) << 16); 144f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter if (i915->current.draw_offset != draw_offset) { 145f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter i915->current.draw_offset = draw_offset; 146179cb587954ff90efa477945297272680c750149Daniel Vetter i915_set_flush_dirty(i915, I915_PIPELINE_FLUSH); 147288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter i915->static_dirty |= I915_DST_RECT; 148d04348aaf69549c14b68e77d4003e4e3499e7cceDaniel Vetter } 149d04348aaf69549c14b68e77d4003e4e3499e7cceDaniel Vetter if (i915->current.draw_size != draw_size) { 150288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter i915->current.draw_size = draw_size; 151288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter i915->static_dirty |= I915_DST_RECT; 152f58c11af72303a7b8ec480b4f216e4a17882e0f4Daniel Vetter } 153f6087955888ee089f986c19b576ef574c9e7bd06Daniel Vetter 15498600c5ff674431fd325acec30ec42909c3ad8edStéphane Marchesin i915->hardware_dirty |= I915_HW_STATIC; 155d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter 156d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter /* flush the cache in case we sample from the old renderbuffers */ 157d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter i915_set_flush_dirty(i915, I915_FLUSH_CACHE); 158d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz} 159d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz 160d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantzstruct i915_tracked_state i915_hw_framebuffer = { 161d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz "framebuffer", 162d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz update_framebuffer, 163d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz I915_NEW_FRAMEBUFFER 164d64561472b8a7fa20512a6586d724c7c7b2867b3Jakob Bornecrantz}; 16511ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 16623d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesinstatic uint32_t need_target_fixup(struct pipe_surface* p, uint32_t *fixup) 167305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter{ 1688709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin const struct 1698709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin { 1708709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin enum pipe_format format; 1718709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin uint hw_swizzle; 1728709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin } fixup_formats[] = { 1738709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin { PIPE_FORMAT_R8G8B8A8_UNORM, 0x21030000 /* BGRA */}, 1748709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin { PIPE_FORMAT_R8G8B8X8_UNORM, 0x21030000 /* BGRX */}, 1758709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin { PIPE_FORMAT_L8_UNORM, 0x00030000 /* RRRA */}, 1768709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin { PIPE_FORMAT_I8_UNORM, 0x00030000 /* RRRA */}, 1778709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin { PIPE_FORMAT_A8_UNORM, 0x33330000 /* AAAA */}, 1788709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin { PIPE_FORMAT_NONE, 0x00000000}, 1798709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin }; 1808709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin 181305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter enum pipe_format f; 182305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter /* if we don't have a surface bound yet, we don't need to fixup the shader */ 183305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter if (!p) 184305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter return 0; 185305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter 186305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter f = p->format; 1878709e2b6c564435111545c470da8796c81f020c4Stéphane Marchesin for(int i = 0; fixup_formats[i].format != PIPE_FORMAT_NONE; i++) 188305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter if (fixup_formats[i].format == f) { 189305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter *fixup = fixup_formats[i].hw_swizzle; 19023d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin return f; 191305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter } 192305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter 193305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter *fixup = 0; 194305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter return 0; 195305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter} 196305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter 19711ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetterstatic void update_dst_buf_vars(struct i915_context *i915) 19811ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter{ 19911ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter struct pipe_surface *cbuf_surface = i915->framebuffer.cbufs[0]; 20011ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter struct pipe_surface *depth_surface = i915->framebuffer.zsbuf; 20111ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter uint32_t dst_buf_vars, cformat, zformat; 20211ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter uint32_t early_z = 0; 203e125786be8e19a9606afb91cd7e8bc37d035b63fStéphane Marchesin uint32_t fixup = 0; 204305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter int need_fixup; 20511ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 20611ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter if (cbuf_surface) 20711ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter cformat = cbuf_surface->format; 20811ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter else 20911ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter cformat = PIPE_FORMAT_B8G8R8A8_UNORM; /* arbitrary */ 21011ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter cformat = translate_format(cformat); 21111ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 21211ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter if (depth_surface) { 21311ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter struct i915_texture *tex = i915_texture(depth_surface->texture); 21411ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter struct i915_screen *is = i915_screen(i915->base.screen); 21511ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 21611ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter zformat = translate_depth_format(depth_surface->format); 21711ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 21811ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter if (is->is_i945 && tex->tiling != I915_TILE_NONE 21911ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter && !i915->fs->info.writes_z) 22011ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter early_z = CLASSIC_EARLY_DEPTH; 22111ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter } else 22211ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter zformat = 0; 22311ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 22411ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter dst_buf_vars = DSTORG_HORT_BIAS(0x8) | /* .5 */ 22511ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter DSTORG_VERT_BIAS(0x8) | /* .5 */ 22611ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter LOD_PRECLAMP_OGL | 22711ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter TEX_DEFAULT_COLOR_OGL | 22811ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter cformat | 22911ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter zformat | 23011ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter early_z; 23111ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 23211ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter if (i915->current.dst_buf_vars != dst_buf_vars) { 23311ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter if (early_z != (i915->current.dst_buf_vars & CLASSIC_EARLY_DEPTH)) 23411ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter i915_set_flush_dirty(i915, I915_PIPELINE_FLUSH); 23511ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 23611ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter i915->current.dst_buf_vars = dst_buf_vars; 23711ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter i915->static_dirty |= I915_DST_VARS; 23811ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter i915->hardware_dirty |= I915_HW_STATIC; 23911ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter } 240305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter 241305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter need_fixup = need_target_fixup(cbuf_surface, &fixup); 24223d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin if (i915->current.target_fixup_format != need_fixup || 243305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter i915->current.fixup_swizzle != fixup) { 24423d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin i915->current.target_fixup_format = need_fixup; 245305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter i915->current.fixup_swizzle = fixup; 24698600c5ff674431fd325acec30ec42909c3ad8edStéphane Marchesin /* we also send a new program to make sure the fixup for RGBA surfaces happens */ 247305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter i915->hardware_dirty |= I915_HW_PROGRAM; 248305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter } 24911ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter} 25011ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter 25111ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetterstruct i915_tracked_state i915_hw_dst_buf_vars = { 25211ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter "dst buf vars", 25311ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter update_dst_buf_vars, 25411ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter I915_NEW_FRAMEBUFFER | I915_NEW_FS 25511ee41fe7f72f7136b531f0c51f820e90a610a79Daniel Vetter}; 256