101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/************************************************************************** 201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * All Rights Reserved. 501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * copy of this software and associated documentation files (the 801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * "Software"), to deal in the Software without restriction, including 901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 1001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 1101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to 1201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * the following conditions: 1301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 1401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * The above copyright notice and this permission notice (including the 1501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * next paragraph) shall be included in all copies or substantial portions 1601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * of the Software. 1701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 1801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * 2601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell **************************************************************************/ 2701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 2801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 2901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_reg.h" 3001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_context.h" 3101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_batch.h" 32abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz#include "i915_debug.h" 3345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin#include "i915_fpc.h" 34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "i915_resource.h" 3501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 3601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "pipe/p_context.h" 3701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "pipe/p_defines.h" 38465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin#include "pipe/p_format.h" 3901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 40465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin#include "util/u_format.h" 41b9baad2aff6ddc5145d91cbfb81d083a21990a80Jakob Bornecrantz#include "util/u_math.h" 42342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter#include "util/u_memory.h" 43b9baad2aff6ddc5145d91cbfb81d083a21990a80Jakob Bornecrantz 44342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstruct i915_tracked_hw_state { 45342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter const char *name; 46179cb587954ff90efa477945297272680c750149Daniel Vetter void (*validate)(struct i915_context *, unsigned *batch_space); 47342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter void (*emit)(struct i915_context *); 48d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter unsigned dirty, batch_space; 49342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter}; 50342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 51342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 52342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic void 53179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_flush(struct i915_context *i915, unsigned *batch_space) 54179cb587954ff90efa477945297272680c750149Daniel Vetter{ 55179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space = i915->flush_dirty ? 1 : 0; 56179cb587954ff90efa477945297272680c750149Daniel Vetter} 57179cb587954ff90efa477945297272680c750149Daniel Vetter 58179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 59d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetteremit_flush(struct i915_context *i915) 60d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter{ 61d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter /* Cache handling is very cheap atm. State handling can request to flushes: 62d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter * - I915_FLUSH_CACHE which is a flush everything request and 63d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter * - I915_PIPELINE_FLUSH which is specifically for the draw_offset flush. 64d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter * Because the cache handling is so dumb, no explicit "invalidate map cache". 65d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter * Also, the first is a strict superset of the latter, so the following logic 66d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter * works. */ 67d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter if (i915->flush_dirty & I915_FLUSH_CACHE) 68d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter OUT_BATCH(MI_FLUSH | FLUSH_MAP_CACHE); 69d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter else if (i915->flush_dirty & I915_PIPELINE_FLUSH) 70d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter OUT_BATCH(MI_FLUSH | INHIBIT_FLUSH_RENDER_CACHE); 71d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter} 72d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter 73179cb587954ff90efa477945297272680c750149Daniel Vetteruint32_t invariant_state[] = { 74179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_AA_CMD | AA_LINE_ECAAR_WIDTH_ENABLE | AA_LINE_ECAAR_WIDTH_1_0 | 75179cb587954ff90efa477945297272680c750149Daniel Vetter AA_LINE_REGION_WIDTH_ENABLE | AA_LINE_REGION_WIDTH_1_0, 76179cb587954ff90efa477945297272680c750149Daniel Vetter 77179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_DFLT_DIFFUSE_CMD, 0, 78179cb587954ff90efa477945297272680c750149Daniel Vetter 79179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_DFLT_SPEC_CMD, 0, 80179cb587954ff90efa477945297272680c750149Daniel Vetter 81179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_DFLT_Z_CMD, 0, 82179cb587954ff90efa477945297272680c750149Daniel Vetter 83179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_COORD_SET_BINDINGS | 84179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(0, 0) | 85179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(1, 1) | 86179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(2, 2) | 87179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(3, 3) | 88179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(4, 4) | 89179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(5, 5) | 90179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(6, 6) | 91179cb587954ff90efa477945297272680c750149Daniel Vetter CSB_TCB(7, 7), 92179cb587954ff90efa477945297272680c750149Daniel Vetter 93179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_RASTER_RULES_CMD | 94179cb587954ff90efa477945297272680c750149Daniel Vetter ENABLE_POINT_RASTER_RULE | 95179cb587954ff90efa477945297272680c750149Daniel Vetter OGL_POINT_RASTER_RULE | 96179cb587954ff90efa477945297272680c750149Daniel Vetter ENABLE_LINE_STRIP_PROVOKE_VRTX | 97179cb587954ff90efa477945297272680c750149Daniel Vetter ENABLE_TRI_FAN_PROVOKE_VRTX | 98179cb587954ff90efa477945297272680c750149Daniel Vetter LINE_STRIP_PROVOKE_VRTX(1) | 99179cb587954ff90efa477945297272680c750149Daniel Vetter TRI_FAN_PROVOKE_VRTX(2) | 100179cb587954ff90efa477945297272680c750149Daniel Vetter ENABLE_TEXKILL_3D_4D | 101179cb587954ff90efa477945297272680c750149Daniel Vetter TEXKILL_4D, 102179cb587954ff90efa477945297272680c750149Daniel Vetter 103179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_DEPTH_SUBRECT_DISABLE, 104179cb587954ff90efa477945297272680c750149Daniel Vetter 105179cb587954ff90efa477945297272680c750149Daniel Vetter /* disable indirect state for now 106179cb587954ff90efa477945297272680c750149Daniel Vetter */ 107179cb587954ff90efa477945297272680c750149Daniel Vetter _3DSTATE_LOAD_INDIRECT | 0, 0}; 108179cb587954ff90efa477945297272680c750149Daniel Vetter 109179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 110179cb587954ff90efa477945297272680c750149Daniel Vetteremit_invariant(struct i915_context *i915) 111179cb587954ff90efa477945297272680c750149Daniel Vetter{ 112179cb587954ff90efa477945297272680c750149Daniel Vetter i915_winsys_batchbuffer_write(i915->batch, invariant_state, 113179cb587954ff90efa477945297272680c750149Daniel Vetter Elements(invariant_state)*sizeof(uint32_t)); 114179cb587954ff90efa477945297272680c750149Daniel Vetter} 115179cb587954ff90efa477945297272680c750149Daniel Vetter 116d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetterstatic void 117179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_immediate(struct i915_context *i915, unsigned *batch_space) 118342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{ 119179cb587954ff90efa477945297272680c750149Daniel Vetter unsigned dirty = (1 << I915_IMMEDIATE_S0 | 1 << I915_IMMEDIATE_S1 | 120179cb587954ff90efa477945297272680c750149Daniel Vetter 1 << I915_IMMEDIATE_S2 | 1 << I915_IMMEDIATE_S3 | 121179cb587954ff90efa477945297272680c750149Daniel Vetter 1 << I915_IMMEDIATE_S3 | 1 << I915_IMMEDIATE_S4 | 122179cb587954ff90efa477945297272680c750149Daniel Vetter 1 << I915_IMMEDIATE_S5 | 1 << I915_IMMEDIATE_S6) & 123179cb587954ff90efa477945297272680c750149Daniel Vetter i915->immediate_dirty; 124179cb587954ff90efa477945297272680c750149Daniel Vetter 125b0dd74aaf730f59d5d29db71a3617ab9eb1cb62fDaniel Vetter if (i915->immediate_dirty & (1 << I915_IMMEDIATE_S0) && i915->vbo) 126342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter i915->validation_buffers[i915->num_validation_buffers++] = i915->vbo; 127179cb587954ff90efa477945297272680c750149Daniel Vetter 128179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space = 1 + util_bitcount(dirty); 129179cb587954ff90efa477945297272680c750149Daniel Vetter} 130179cb587954ff90efa477945297272680c750149Daniel Vetter 131179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 132179cb587954ff90efa477945297272680c750149Daniel Vetteremit_immediate(struct i915_context *i915) 133179cb587954ff90efa477945297272680c750149Daniel Vetter{ 134a9cb01f35597797a83ac940b0230a8f74f99a1b8Stéphane Marchesin /* remove unwanted bits and S7 */ 135179cb587954ff90efa477945297272680c750149Daniel Vetter unsigned dirty = (1 << I915_IMMEDIATE_S0 | 1 << I915_IMMEDIATE_S1 | 136179cb587954ff90efa477945297272680c750149Daniel Vetter 1 << I915_IMMEDIATE_S2 | 1 << I915_IMMEDIATE_S3 | 137179cb587954ff90efa477945297272680c750149Daniel Vetter 1 << I915_IMMEDIATE_S3 | 1 << I915_IMMEDIATE_S4 | 138179cb587954ff90efa477945297272680c750149Daniel Vetter 1 << I915_IMMEDIATE_S5 | 1 << I915_IMMEDIATE_S6) & 139179cb587954ff90efa477945297272680c750149Daniel Vetter i915->immediate_dirty; 140179cb587954ff90efa477945297272680c750149Daniel Vetter int i, num = util_bitcount(dirty); 141179cb587954ff90efa477945297272680c750149Daniel Vetter assert(num && num <= I915_MAX_IMMEDIATE); 142179cb587954ff90efa477945297272680c750149Daniel Vetter 143179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | 144179cb587954ff90efa477945297272680c750149Daniel Vetter dirty << 4 | (num - 1)); 145179cb587954ff90efa477945297272680c750149Daniel Vetter 146179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->immediate_dirty & (1 << I915_IMMEDIATE_S0)) { 147179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->vbo) 148179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_RELOC(i915->vbo, I915_USAGE_VERTEX, 149179cb587954ff90efa477945297272680c750149Daniel Vetter i915->current.immediate[I915_IMMEDIATE_S0]); 150179cb587954ff90efa477945297272680c750149Daniel Vetter else 151179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(0); 152179cb587954ff90efa477945297272680c750149Daniel Vetter } 153179cb587954ff90efa477945297272680c750149Daniel Vetter 154179cb587954ff90efa477945297272680c750149Daniel Vetter for (i = 1; i < I915_MAX_IMMEDIATE; i++) { 15523d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin if (dirty & (1 << i)) { 15623d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin /* Fixup blend function for A8 dst buffers. 15723d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin * When we blend to an A8 buffer, the GPU thinks it's a G8 buffer, 15823d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin * and therefore we need to use the color factor for alphas. */ 15923d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin if ((i == I915_IMMEDIATE_S6) && 16023d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin (i915->current.target_fixup_format == PIPE_FORMAT_A8_UNORM)) { 16123d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin uint32_t imm = i915->current.immediate[i]; 16223d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin uint32_t srcRGB = (imm >> S6_CBUF_SRC_BLEND_FACT_SHIFT) & BLENDFACT_MASK; 16323d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin if (srcRGB == BLENDFACT_DST_ALPHA) 16423d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin srcRGB = BLENDFACT_DST_COLR; 16523d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin else if (srcRGB == BLENDFACT_INV_DST_ALPHA) 16623d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin srcRGB = BLENDFACT_INV_DST_COLR; 16723d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin imm &= ~SRC_BLND_FACT(BLENDFACT_MASK); 16823d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin imm |= SRC_BLND_FACT(srcRGB); 16923d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin OUT_BATCH(imm); 17023d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin } else { 17123d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin OUT_BATCH(i915->current.immediate[i]); 17223d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin } 17323d4a0569dcb70bdfd748bf7e1f5102289bfad6bStéphane Marchesin } 174179cb587954ff90efa477945297272680c750149Daniel Vetter } 175179cb587954ff90efa477945297272680c750149Daniel Vetter} 176179cb587954ff90efa477945297272680c750149Daniel Vetter 177179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 178179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_dynamic(struct i915_context *i915, unsigned *batch_space) 179179cb587954ff90efa477945297272680c750149Daniel Vetter{ 180179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space = util_bitcount(i915->dynamic_dirty & ((1 << I915_MAX_DYNAMIC) - 1)); 181179cb587954ff90efa477945297272680c750149Daniel Vetter} 182179cb587954ff90efa477945297272680c750149Daniel Vetter 183179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 184179cb587954ff90efa477945297272680c750149Daniel Vetteremit_dynamic(struct i915_context *i915) 185179cb587954ff90efa477945297272680c750149Daniel Vetter{ 186179cb587954ff90efa477945297272680c750149Daniel Vetter int i; 187179cb587954ff90efa477945297272680c750149Daniel Vetter for (i = 0; i < I915_MAX_DYNAMIC; i++) { 188179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->dynamic_dirty & (1 << i)) 189179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(i915->current.dynamic[i]); 190179cb587954ff90efa477945297272680c750149Daniel Vetter } 191342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter} 192342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 193342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic void 194179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_static(struct i915_context *i915, unsigned *batch_space) 195342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{ 196288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter *batch_space = 0; 197179cb587954ff90efa477945297272680c750149Daniel Vetter 198288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->current.cbuf_bo && (i915->static_dirty & I915_DST_BUF_COLOR)) { 199342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter i915->validation_buffers[i915->num_validation_buffers++] 200342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter = i915->current.cbuf_bo; 201179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space += 3; 202179cb587954ff90efa477945297272680c750149Daniel Vetter } 203342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 204288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->current.depth_bo && (i915->static_dirty & I915_DST_BUF_DEPTH)) { 205342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter i915->validation_buffers[i915->num_validation_buffers++] 206342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter = i915->current.depth_bo; 207179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space += 3; 208179cb587954ff90efa477945297272680c750149Daniel Vetter } 209288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter 210288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->static_dirty & I915_DST_VARS) 211288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter *batch_space += 2; 212288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter 213288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->static_dirty & I915_DST_RECT) 214288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter *batch_space += 5; 215179cb587954ff90efa477945297272680c750149Daniel Vetter} 216179cb587954ff90efa477945297272680c750149Daniel Vetter 217179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 218179cb587954ff90efa477945297272680c750149Daniel Vetteremit_static(struct i915_context *i915) 219179cb587954ff90efa477945297272680c750149Daniel Vetter{ 220288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->current.cbuf_bo && (i915->static_dirty & I915_DST_BUF_COLOR)) { 221179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(_3DSTATE_BUF_INFO_CMD); 222179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(i915->current.cbuf_flags); 223179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_RELOC(i915->current.cbuf_bo, 224179cb587954ff90efa477945297272680c750149Daniel Vetter I915_USAGE_RENDER, 225179cb587954ff90efa477945297272680c750149Daniel Vetter 0); 226179cb587954ff90efa477945297272680c750149Daniel Vetter } 227179cb587954ff90efa477945297272680c750149Daniel Vetter 228179cb587954ff90efa477945297272680c750149Daniel Vetter /* What happens if no zbuf?? 229179cb587954ff90efa477945297272680c750149Daniel Vetter */ 230288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->current.depth_bo && (i915->static_dirty & I915_DST_BUF_DEPTH)) { 231179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(_3DSTATE_BUF_INFO_CMD); 232179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(i915->current.depth_flags); 233179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_RELOC(i915->current.depth_bo, 234179cb587954ff90efa477945297272680c750149Daniel Vetter I915_USAGE_RENDER, 235179cb587954ff90efa477945297272680c750149Daniel Vetter 0); 236179cb587954ff90efa477945297272680c750149Daniel Vetter } 237179cb587954ff90efa477945297272680c750149Daniel Vetter 238288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->static_dirty & I915_DST_VARS) { 239179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD); 240179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(i915->current.dst_buf_vars); 241179cb587954ff90efa477945297272680c750149Daniel Vetter } 242342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter} 243342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 244342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic void 245179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_map(struct i915_context *i915, unsigned *batch_space) 246342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{ 247342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter const uint enabled = i915->current.sampler_enable_flags; 248342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter uint unit; 249342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter struct i915_texture *tex; 250342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 251179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space = i915->current.sampler_enable_nr ? 252179cb587954ff90efa477945297272680c750149Daniel Vetter 2 + 3*i915->current.sampler_enable_nr : 0; 253342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 254342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter for (unit = 0; unit < I915_TEX_UNITS; unit++) { 255342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter if (enabled & (1 << unit)) { 256179cb587954ff90efa477945297272680c750149Daniel Vetter tex = i915_texture(i915->fragment_sampler_views[unit]->texture); 257179cb587954ff90efa477945297272680c750149Daniel Vetter i915->validation_buffers[i915->num_validation_buffers++] = tex->buffer; 258342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter } 259342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter } 260342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter} 261342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 262179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 263179cb587954ff90efa477945297272680c750149Daniel Vetteremit_map(struct i915_context *i915) 264179cb587954ff90efa477945297272680c750149Daniel Vetter{ 265179cb587954ff90efa477945297272680c750149Daniel Vetter const uint nr = i915->current.sampler_enable_nr; 266179cb587954ff90efa477945297272680c750149Daniel Vetter if (nr) { 267179cb587954ff90efa477945297272680c750149Daniel Vetter const uint enabled = i915->current.sampler_enable_flags; 268179cb587954ff90efa477945297272680c750149Daniel Vetter uint unit; 269179cb587954ff90efa477945297272680c750149Daniel Vetter uint count = 0; 270179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(_3DSTATE_MAP_STATE | (3 * nr)); 271179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(enabled); 272179cb587954ff90efa477945297272680c750149Daniel Vetter for (unit = 0; unit < I915_TEX_UNITS; unit++) { 273179cb587954ff90efa477945297272680c750149Daniel Vetter if (enabled & (1 << unit)) { 274179cb587954ff90efa477945297272680c750149Daniel Vetter struct i915_texture *texture = i915_texture(i915->fragment_sampler_views[unit]->texture); 275179cb587954ff90efa477945297272680c750149Daniel Vetter struct i915_winsys_buffer *buf = texture->buffer; 276179cb587954ff90efa477945297272680c750149Daniel Vetter assert(buf); 277179cb587954ff90efa477945297272680c750149Daniel Vetter 278179cb587954ff90efa477945297272680c750149Daniel Vetter count++; 279179cb587954ff90efa477945297272680c750149Daniel Vetter 280179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_RELOC(buf, I915_USAGE_SAMPLER, 0); 281179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(i915->current.texbuffer[unit][0]); /* MS3 */ 282179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(i915->current.texbuffer[unit][1]); /* MS4 */ 283179cb587954ff90efa477945297272680c750149Daniel Vetter } 284179cb587954ff90efa477945297272680c750149Daniel Vetter } 285179cb587954ff90efa477945297272680c750149Daniel Vetter assert(count == nr); 286179cb587954ff90efa477945297272680c750149Daniel Vetter } 287179cb587954ff90efa477945297272680c750149Daniel Vetter} 288179cb587954ff90efa477945297272680c750149Daniel Vetter 289179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 290179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_sampler(struct i915_context *i915, unsigned *batch_space) 291179cb587954ff90efa477945297272680c750149Daniel Vetter{ 292179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space = i915->current.sampler_enable_nr ? 293179cb587954ff90efa477945297272680c750149Daniel Vetter 2 + 3*i915->current.sampler_enable_nr : 0; 294179cb587954ff90efa477945297272680c750149Daniel Vetter} 295179cb587954ff90efa477945297272680c750149Daniel Vetter 296179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 297179cb587954ff90efa477945297272680c750149Daniel Vetteremit_sampler(struct i915_context *i915) 298179cb587954ff90efa477945297272680c750149Daniel Vetter{ 299179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->current.sampler_enable_nr) { 300179cb587954ff90efa477945297272680c750149Daniel Vetter int i; 301179cb587954ff90efa477945297272680c750149Daniel Vetter 302288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter OUT_BATCH( _3DSTATE_SAMPLER_STATE | 303179cb587954ff90efa477945297272680c750149Daniel Vetter (3 * i915->current.sampler_enable_nr) ); 304179cb587954ff90efa477945297272680c750149Daniel Vetter 305179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH( i915->current.sampler_enable_flags ); 306179cb587954ff90efa477945297272680c750149Daniel Vetter 307179cb587954ff90efa477945297272680c750149Daniel Vetter for (i = 0; i < I915_TEX_UNITS; i++) { 308179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->current.sampler_enable_flags & (1<<i)) { 309179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH( i915->current.sampler[i][0] ); 310179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH( i915->current.sampler[i][1] ); 311179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH( i915->current.sampler[i][2] ); 312179cb587954ff90efa477945297272680c750149Daniel Vetter } 313179cb587954ff90efa477945297272680c750149Daniel Vetter } 314179cb587954ff90efa477945297272680c750149Daniel Vetter } 315179cb587954ff90efa477945297272680c750149Daniel Vetter} 316179cb587954ff90efa477945297272680c750149Daniel Vetter 31745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic boolean is_tex_instruction(uint32_t* instruction) 31845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{ 31945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin uint32_t op = instruction[0] &0xFF000000; 32045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin return ( (op == T0_TEXLD) || 32145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin (op == T0_TEXLDP) || 32245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin (op == T0_TEXLDB)); 32345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin} 32445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 32545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic uint32_t tex_sampler(uint32_t* instruction) 32645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{ 32745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin return ( instruction[0] & T0_SAMPLER_NR_MASK); 32845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin} 32945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 33045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic uint additional_constants(struct i915_context *i915) 33145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{ 33245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int i; 33345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 33445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin for (i = 0 ; i < i915->fs->program_len; i+=3) { 33545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin if ( is_tex_instruction(i915->fs->program + i)) { 33645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int sampler = tex_sampler(i915->fs->program + i); 33745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin assert(sampler < I915_TEX_UNITS); 33845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin if ( i915->current.sampler_srgb[sampler] ) 33945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin return 1; 34045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin } 34145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin } 34245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin return 0; 34345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin} 34445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 345179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 346179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_constants(struct i915_context *i915, unsigned *batch_space) 347179cb587954ff90efa477945297272680c750149Daniel Vetter{ 34845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int nr = i915->fs->num_constants ? 349179cb587954ff90efa477945297272680c750149Daniel Vetter 2 + 4*i915->fs->num_constants : 0; 35045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 35145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin nr += 4*additional_constants(i915); 35245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin *batch_space = nr; 353179cb587954ff90efa477945297272680c750149Daniel Vetter} 354179cb587954ff90efa477945297272680c750149Daniel Vetter 355179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 356179cb587954ff90efa477945297272680c750149Daniel Vetteremit_constants(struct i915_context *i915) 357179cb587954ff90efa477945297272680c750149Daniel Vetter{ 358179cb587954ff90efa477945297272680c750149Daniel Vetter /* Collate the user-defined constants with the fragment shader's 359179cb587954ff90efa477945297272680c750149Daniel Vetter * immediates according to the constant_flags[] array. 360179cb587954ff90efa477945297272680c750149Daniel Vetter */ 36145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin const uint nr = i915->fs->num_constants + additional_constants(i915); 36245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 36345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin assert(nr < I915_MAX_CONSTANT); 364179cb587954ff90efa477945297272680c750149Daniel Vetter if (nr) { 36545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin const float srgb_constants[4] = {1.0/1.055, 0.055/1.055, 2.4, 0.0822}; 366179cb587954ff90efa477945297272680c750149Daniel Vetter uint i; 367179cb587954ff90efa477945297272680c750149Daniel Vetter 368179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH( _3DSTATE_PIXEL_SHADER_CONSTANTS | (nr * 4) ); 369179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH((1 << nr) - 1); 370179cb587954ff90efa477945297272680c750149Daniel Vetter 371179cb587954ff90efa477945297272680c750149Daniel Vetter for (i = 0; i < nr; i++) { 372179cb587954ff90efa477945297272680c750149Daniel Vetter const uint *c; 373179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->fs->constant_flags[i] == I915_CONSTFLAG_USER) { 374179cb587954ff90efa477945297272680c750149Daniel Vetter /* grab user-defined constant */ 375179cb587954ff90efa477945297272680c750149Daniel Vetter c = (uint *) i915_buffer(i915->constants[PIPE_SHADER_FRAGMENT])->data; 376179cb587954ff90efa477945297272680c750149Daniel Vetter c += 4 * i; 377179cb587954ff90efa477945297272680c750149Daniel Vetter } 37845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin else if (i < i915->fs->num_constants) { 379179cb587954ff90efa477945297272680c750149Daniel Vetter /* emit program constant */ 380179cb587954ff90efa477945297272680c750149Daniel Vetter c = (uint *) i915->fs->constants[i]; 38145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin } else { 38245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin /* emit constants for sRGB */ 38345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 38445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin /* save const position in context for use in shader emit */ 38545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin i915->current.srgb_const_offset = i; 38645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 38745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin c = (uint *) srgb_constants; 388179cb587954ff90efa477945297272680c750149Daniel Vetter } 389179cb587954ff90efa477945297272680c750149Daniel Vetter#if 0 /* debug */ 390179cb587954ff90efa477945297272680c750149Daniel Vetter { 391179cb587954ff90efa477945297272680c750149Daniel Vetter float *f = (float *) c; 392179cb587954ff90efa477945297272680c750149Daniel Vetter printf("Const %2d: %f %f %f %f %s\n", i, f[0], f[1], f[2], f[3], 393179cb587954ff90efa477945297272680c750149Daniel Vetter (i915->fs->constant_flags[i] == I915_CONSTFLAG_USER 394179cb587954ff90efa477945297272680c750149Daniel Vetter ? "user" : "immediate")); 395179cb587954ff90efa477945297272680c750149Daniel Vetter } 396179cb587954ff90efa477945297272680c750149Daniel Vetter#endif 397179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(*c++); 398179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(*c++); 399179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(*c++); 400179cb587954ff90efa477945297272680c750149Daniel Vetter OUT_BATCH(*c++); 401179cb587954ff90efa477945297272680c750149Daniel Vetter } 402179cb587954ff90efa477945297272680c750149Daniel Vetter } 403179cb587954ff90efa477945297272680c750149Daniel Vetter} 404179cb587954ff90efa477945297272680c750149Daniel Vetter 405179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 406179cb587954ff90efa477945297272680c750149Daniel Vettervalidate_program(struct i915_context *i915, unsigned *batch_space) 407179cb587954ff90efa477945297272680c750149Daniel Vetter{ 40845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin uint additional_size = 0, i; 40945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 41045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin additional_size += i915->current.target_fixup_format ? 3 : 0; 41126e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin 41245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin for (i = 0 ; i < i915->fs->program_len; i+=3) 41345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin if ( is_tex_instruction(i915->fs->program + i) && 41445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin i915->current.sampler_srgb[tex_sampler(i915->fs->program+i)] ) 41545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin additional_size += 3 * 8 /* 8 instructions for srgb emulation */; 41645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 41745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin /* we need more batch space if we want to emulate rgba framebuffers 41845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin * or sRGB textures */ 41945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin *batch_space = i915->fs->decl_len + i915->fs->program_len + additional_size; 42045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin} 42145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 42245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic void emit_instruction(struct i915_context *i915, 42345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int op, 42445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int dst_mask, 42545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int dst_reg, 42645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int src0_reg, 42745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int src1_reg, 42845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int src2_reg) 42945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{ 43045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin OUT_BATCH(op | 43145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin dst_mask | 43245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 0 | /* saturate */ 43345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin A0_DEST(dst_reg) | 43445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin A0_SRC0(src0_reg) 43545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin ); 43645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin OUT_BATCH(A1_SRC0(src0_reg) | A1_SRC1(src1_reg)); 43745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin OUT_BATCH(A2_SRC1(src1_reg) | A2_SRC2(src2_reg)); 43845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin} 43945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 44045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinstatic void 44145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesinemit_srgb_fixup(struct i915_context *i915, 44245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin uint *program) 44345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin{ 44445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int dst_reg = 44545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin (program[0] & UREG_TYPE_NR_MASK) >> UREG_A0_DEST_SHIFT_LEFT; 44645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int dst_mask = program[0] & A0_DEST_CHANNEL_ALL; 44745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int cst_idx = i915->current.srgb_const_offset; 44845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int cst0_reg = swizzle(UREG(REG_TYPE_CONST, cst_idx), X, X, X, X); 44945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int cst1_reg = swizzle(UREG(REG_TYPE_CONST, cst_idx), Y, Y, Y, Y); 45045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int cst2_reg = swizzle(UREG(REG_TYPE_CONST, cst_idx), Z, Z, Z, Z); 45145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int t1_reg = UREG(REG_TYPE_R, 1); 45245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int t1x_reg = swizzle(UREG(REG_TYPE_R, 1), X, X, X, X); 45345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int t1y_reg = swizzle(UREG(REG_TYPE_R, 1), Y, Y, Y, Y); 45445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin int t1z_reg = swizzle(UREG(REG_TYPE_R, 1), Z, Z, Z, Z); 45545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 45645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_MAD, A0_DEST_CHANNEL_ALL, t1_reg, dst_reg, cst0_reg, cst1_reg); 45745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_LOG, A0_DEST_CHANNEL_X, t1_reg, t1x_reg, 0, 0); 45845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_LOG, A0_DEST_CHANNEL_Y, t1_reg, t1y_reg, 0, 0); 45945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_LOG, A0_DEST_CHANNEL_Z, t1_reg, t1z_reg, 0, 0); 46045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_MUL, A0_DEST_CHANNEL_ALL, t1_reg, t1_reg, cst2_reg, 0); 46145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_EXP, dst_mask & A0_DEST_CHANNEL_X, dst_reg, t1x_reg, 0, 0); 46245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_EXP, dst_mask & A0_DEST_CHANNEL_Y, dst_reg, t1y_reg, 0, 0); 46345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_instruction(i915, A0_EXP, dst_mask & A0_DEST_CHANNEL_Z, dst_reg, t1z_reg, 0, 0); 464179cb587954ff90efa477945297272680c750149Daniel Vetter} 465179cb587954ff90efa477945297272680c750149Daniel Vetter 466179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 467179cb587954ff90efa477945297272680c750149Daniel Vetteremit_program(struct i915_context *i915) 468179cb587954ff90efa477945297272680c750149Daniel Vetter{ 46945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin uint additional_size = 0; 47026e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin uint i; 471465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin 47245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin /* count how much additional space we'll need */ 47345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin validate_program(i915, &additional_size); 47445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin additional_size -= i915->fs->decl_len + i915->fs->program_len; 47545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 476465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin /* we should always have, at least, a pass-through program */ 477465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin assert(i915->fs->program_len > 0); 478465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin 4798e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin /* output the declarations */ 48026e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin { 48126e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin /* first word has the size, we have to adjust that */ 4828e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin uint size = (i915->fs->decl[0]); 48345fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin size += additional_size; 48426e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin OUT_BATCH(size); 485a9cb01f35597797a83ac940b0230a8f74f99a1b8Stéphane Marchesin } 486a9cb01f35597797a83ac940b0230a8f74f99a1b8Stéphane Marchesin 4878e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin for (i = 1 ; i < i915->fs->decl_len; i++) 4888e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin OUT_BATCH(i915->fs->decl[i]); 4898e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin 4908e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin /* output the program */ 49145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin assert(i915->fs->program_len % 3 == 0); 49245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin for (i = 0 ; i < i915->fs->program_len; i+=3) { 49326e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin OUT_BATCH(i915->fs->program[i]); 49445fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin OUT_BATCH(i915->fs->program[i+1]); 49545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin OUT_BATCH(i915->fs->program[i+2]); 49645fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 49745fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin /* TEX fixup for sRGB */ 49845fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin if ( is_tex_instruction(i915->fs->program+i) && 49945fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin i915->current.sampler_srgb[tex_sampler(i915->fs->program+i)] ) 50045fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin emit_srgb_fixup(i915, i915->fs->program); 50145fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin 50245fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin } 50326e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin 50426e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin /* we emit an additional mov with swizzle to fake RGBA framebuffers */ 50545fc069600ddbfe07a0a0cd5280161a8c7c55dd0Stéphane Marchesin if (i915->current.target_fixup_format) { 50626e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin /* mov out_color, out_color.zyxw */ 50726e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin OUT_BATCH(A0_MOV | 50826e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) | 50926e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin A0_DEST_CHANNEL_ALL | 51026e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin (REG_TYPE_OC << A0_SRC0_TYPE_SHIFT) | 51126e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin (T_DIFFUSE << A0_SRC0_NR_SHIFT)); 512305bcda4b583641bab5a7bfa6ce4e30a8559a868Daniel Vetter OUT_BATCH(i915->current.fixup_swizzle); 51326e7436ad3e757ed10cb477f76ab3fdce9710923Stéphane Marchesin OUT_BATCH(0); 514465183c6ae594ad399f72ade027e49adcb1f763bStéphane Marchesin } 515179cb587954ff90efa477945297272680c750149Daniel Vetter} 516179cb587954ff90efa477945297272680c750149Daniel Vetter 517179cb587954ff90efa477945297272680c750149Daniel Vetterstatic void 518179cb587954ff90efa477945297272680c750149Daniel Vetteremit_draw_rect(struct i915_context *i915) 519179cb587954ff90efa477945297272680c750149Daniel Vetter{ 520288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter if (i915->static_dirty & I915_DST_RECT) { 521288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter OUT_BATCH(_3DSTATE_DRAW_RECT_CMD); 522288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter OUT_BATCH(DRAW_RECT_DIS_DEPTH_OFS); 523288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter OUT_BATCH(i915->current.draw_offset); 524288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter OUT_BATCH(i915->current.draw_size); 525288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter OUT_BATCH(i915->current.draw_offset); 526288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter } 527179cb587954ff90efa477945297272680c750149Daniel Vetter} 528342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 529342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetterstatic boolean 530d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetteri915_validate_state(struct i915_context *i915, unsigned *batch_space) 531342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter{ 532179cb587954ff90efa477945297272680c750149Daniel Vetter unsigned tmp; 533342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 534342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter i915->num_validation_buffers = 0; 535179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->hardware_dirty & I915_HW_INVARIANT) 536179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space = Elements(invariant_state); 537179cb587954ff90efa477945297272680c750149Daniel Vetter else 538179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space = 0; 539179cb587954ff90efa477945297272680c750149Daniel Vetter 540633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#if 0 541633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesinstatic int counter_total = 0; 542633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#define VALIDATE_ATOM(atom, hw_dirty) \ 543633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin if (i915->hardware_dirty & hw_dirty) { \ 544633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin static int counter_##atom = 0;\ 545633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin validate_##atom(i915, &tmp); \ 546633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin *batch_space += tmp;\ 547633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin counter_##atom += tmp;\ 548633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin counter_total += tmp;\ 549633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin printf("%s: \t%d/%d \t%2.2f\n",#atom, counter_##atom, counter_total, counter_##atom*100.f/counter_total);} 550633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#else 551179cb587954ff90efa477945297272680c750149Daniel Vetter#define VALIDATE_ATOM(atom, hw_dirty) \ 552179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->hardware_dirty & hw_dirty) { \ 553179cb587954ff90efa477945297272680c750149Daniel Vetter validate_##atom(i915, &tmp); \ 554179cb587954ff90efa477945297272680c750149Daniel Vetter *batch_space += tmp; } 555633f21652aacbcd7eebe28597cac1dc556ea2b45Stéphane Marchesin#endif 556179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(flush, I915_HW_FLUSH); 557179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(immediate, I915_HW_IMMEDIATE); 558179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(dynamic, I915_HW_DYNAMIC); 559179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(static, I915_HW_STATIC); 560179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(map, I915_HW_MAP); 561179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(sampler, I915_HW_SAMPLER); 562179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(constants, I915_HW_CONSTANTS); 563179cb587954ff90efa477945297272680c750149Daniel Vetter VALIDATE_ATOM(program, I915_HW_PROGRAM); 564179cb587954ff90efa477945297272680c750149Daniel Vetter#undef VALIDATE_ATOM 565342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 566342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter if (i915->num_validation_buffers == 0) 567342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter return TRUE; 568342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 569342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter if (!i915_winsys_validate_buffers(i915->batch, i915->validation_buffers, 570179cb587954ff90efa477945297272680c750149Daniel Vetter i915->num_validation_buffers)) 571342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter return FALSE; 572342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 573342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter return TRUE; 574342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter} 57501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 57601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/* Push the state into the sarea and/or texture memory. 57701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell */ 57801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellvoid 57901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwelli915_emit_hardware_state(struct i915_context *i915 ) 58001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{ 581d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter unsigned batch_space; 582abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz uintptr_t save_ptr; 583abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz 5849070879a79c3400f08a0b136d8472a7625680ca1Daniel Vetter assert(i915->dirty == 0); 5859070879a79c3400f08a0b136d8472a7625680ca1Daniel Vetter 586abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz if (I915_DBG_ON(DBG_ATOMS)) 587abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz i915_dump_hardware_dirty(i915, __FUNCTION__); 588abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz 589d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter if (!i915_validate_state(i915, &batch_space)) { 590342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter FLUSH_BATCH(NULL); 591d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter assert(i915_validate_state(i915, &batch_space)); 592342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter } 593342016010a515ccc4492924ca260d7ff76ecb1b5Daniel Vetter 5948f9e546fde27db75ea87bcf8ae333bc70616deb4Daniel Vetter if(!BEGIN_BATCH(batch_space)) { 5954abe1eb980ed76d2b2d3383eaab520d0aa2ae6f4Michel Dänzer FLUSH_BATCH(NULL); 596d42c9433b0a3d9b3a198261d8037ce0d4595452dDaniel Vetter assert(i915_validate_state(i915, &batch_space)); 5978f9e546fde27db75ea87bcf8ae333bc70616deb4Daniel Vetter assert(BEGIN_BATCH(batch_space)); 59854be3a7added5b6675a78f6df711d3bebc4c6cd5José Fonseca } 59901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell 600abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz save_ptr = (uintptr_t)i915->batch->ptr; 601abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz 602179cb587954ff90efa477945297272680c750149Daniel Vetter#define EMIT_ATOM(atom, hw_dirty) \ 603179cb587954ff90efa477945297272680c750149Daniel Vetter if (i915->hardware_dirty & hw_dirty) \ 604179cb587954ff90efa477945297272680c750149Daniel Vetter emit_##atom(i915); 605179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(flush, I915_HW_FLUSH); 606179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(invariant, I915_HW_INVARIANT); 607179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(immediate, I915_HW_IMMEDIATE); 608179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(dynamic, I915_HW_DYNAMIC); 609179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(static, I915_HW_STATIC); 610179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(map, I915_HW_MAP); 611179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(sampler, I915_HW_SAMPLER); 612179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(constants, I915_HW_CONSTANTS); 613179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(program, I915_HW_PROGRAM); 614179cb587954ff90efa477945297272680c750149Daniel Vetter EMIT_ATOM(draw_rect, I915_HW_STATIC); 615179cb587954ff90efa477945297272680c750149Daniel Vetter#undef EMIT_ATOM 61694fda5695e3e05d93dfa20e8d193c2a784c2ae65Keith Whitwell 617ee7acf6493e934dbc78d98738195a3804c23722eDaniel Vetter I915_DBG(DBG_EMIT, "%s: used %d dwords, %d dwords reserved\n", __FUNCTION__, 618abbb1bde06990cb15c82ebcdb9ac07b00cb0ab4fJakob Bornecrantz ((uintptr_t)i915->batch->ptr - save_ptr) / 4, 619ee7acf6493e934dbc78d98738195a3804c23722eDaniel Vetter batch_space); 620ee7acf6493e934dbc78d98738195a3804c23722eDaniel Vetter assert(((uintptr_t)i915->batch->ptr - save_ptr) / 4 == batch_space); 62194fda5695e3e05d93dfa20e8d193c2a784c2ae65Keith Whitwell 622e23966f3de81342f7bd11f1e79c04022b5f0193fKeith Whitwell i915->hardware_dirty = 0; 623b9baad2aff6ddc5145d91cbfb81d083a21990a80Jakob Bornecrantz i915->immediate_dirty = 0; 6248fb0ecd0cf4a4d672c0744abb4a9f030b3a17527Jakob Bornecrantz i915->dynamic_dirty = 0; 625288504fac7b659da6bd45f22ccfb39d130250f9cDaniel Vetter i915->static_dirty = 0; 626179cb587954ff90efa477945297272680c750149Daniel Vetter i915->flush_dirty = 0; 62701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell} 628