1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp. 2006. All Rights Reserved. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org distribute, sublicense, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next paragraph) shall be included in all copies or substantial 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_wm.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_state.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/formats.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/samplerobj.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/prog_parameter.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glsl/ralloc.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Return number of src args for given instruction */ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint brw_wm_nr_args( GLuint opcode ) 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (opcode) { 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_FRONTFACING: 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_PIXELXY: 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_CINTERP: 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_WPOSXY: 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_DELTAXY: 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_LINTERP: 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_PIXELW: 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 2; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_FB_WRITE: 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case WM_PINTERP: 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 3; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(opcode < MAX_OPCODE); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_num_inst_src_regs(opcode); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint brw_wm_is_scalar_result( GLuint opcode ) 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (opcode) { 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_COS: 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_EX2: 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_LG2: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_POW: 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_RCP: 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_RSQ: 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_SIN: 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_DP2: 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_DP3: 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_DP4: 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_DPH: 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCODE_DST: 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do GPU code generation for non-GLSL shader. non-GLSL shaders have 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * no flow control instructions so we can more readily do SSA-style 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * optimizations. 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_wm_non_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Augment fragment program. Add instructions for pre- and 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * post-fragment-program tasks such as interpolation and fogging. 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_pass_fp(c); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Translate to intermediate representation. Build register usage 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * chains. 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_pass0(c); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Dead code removal. 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_pass1(c); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Register allocation. 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Divide by two because we operate on 16 pixels at a time and require 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * two GRF entries for each logical shader register. 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->grf_limit = BRW_WM_MAX_GRF / 2; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_pass2(c); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* how many general-purpose registers are used */ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->prog_data.reg_blocks = brw_register_blocks(c->max_wm_grf); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit GEN4 code. 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_emit(c); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return a bitfield where bit n is set if barycentric interpolation mode n 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (see enum brw_wm_barycentric_interp_mode) is needed by the fragment shader. 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_compute_barycentric_interp_modes(struct brw_context *brw, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool shade_model_flat, 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_fragment_program *fprog) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned barycentric_interp_modes = 0; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int attr; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Loop through all fragment shader inputs to figure out what interpolation 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modes are in use, and set the appropriate bits in 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * barycentric_interp_modes. 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (attr = 0; attr < FRAG_ATTRIB_MAX; ++attr) { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum glsl_interp_qualifier interp_qualifier = 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprog->InterpQualifier[attr]; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is_centroid = fprog->IsCentroid & BITFIELD64_BIT(attr); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is_gl_Color = attr == FRAG_ATTRIB_COL0 || attr == FRAG_ATTRIB_COL1; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ignore unused inputs. */ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(fprog->Base.InputsRead & BITFIELD64_BIT(attr))) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ignore WPOS and FACE, because they don't require interpolation. */ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attr == FRAG_ATTRIB_WPOS || attr == FRAG_ATTRIB_FACE) 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Determine the set (or sets) of barycentric coordinates needed to 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * interpolate this variable. Note that when 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * brw->needs_unlit_centroid_workaround is set, centroid interpolation 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * uses PIXEL interpolation for unlit pixels and CENTROID interpolation 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for lit pixels, so we need both sets of barycentric coordinates. 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (interp_qualifier == INTERP_QUALIFIER_NOPERSPECTIVE) { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_centroid) { 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barycentric_interp_modes |= 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!is_centroid || brw->needs_unlit_centroid_workaround) { 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barycentric_interp_modes |= 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (interp_qualifier == INTERP_QUALIFIER_SMOOTH || 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!(shade_model_flat && is_gl_Color) && 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org interp_qualifier == INTERP_QUALIFIER_NONE)) { 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_centroid) { 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barycentric_interp_modes |= 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!is_centroid || brw->needs_unlit_centroid_workaround) { 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org barycentric_interp_modes |= 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return barycentric_interp_modes; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_wm_payload_setup(struct brw_context *brw, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_wm_compile *c) 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool uses_depth = (c->fp->program.Base.InputsRead & 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (1 << FRAG_ATTRIB_WPOS)) != 0; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned barycentric_interp_modes = c->prog_data.barycentric_interp_modes; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen >= 6) { 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R0-1: masks, pixel X/Y coordinates. */ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->nr_payload_regs = 2; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R2: only for 32-pixel dispatch.*/ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R3-26: barycentric interpolation coordinates. These appear in the 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * same order that they appear in the brw_wm_barycentric_interp_mode 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * enum. Each set of coordinates occupies 2 registers if dispatch width 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * == 8 and 4 registers if dispatch width == 16. Coordinates only 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * appear if they were enabled using the "Barycentric Interpolation 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mode" bits in WM_STATE. 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < BRW_WM_BARYCENTRIC_INTERP_MODE_COUNT; ++i) { 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (barycentric_interp_modes & (1 << i)) { 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->barycentric_coord_reg[i] = c->nr_payload_regs; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->nr_payload_regs += 2; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->dispatch_width == 16) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->nr_payload_regs += 2; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R27: interpolated depth if uses source depth */ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uses_depth) { 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->source_depth_reg = c->nr_payload_regs; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->nr_payload_regs++; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->dispatch_width == 16) { 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R28: interpolated depth if not 8-wide. */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->nr_payload_regs++; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R29: interpolated W set if GEN6_WM_USES_SOURCE_W. 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (uses_depth) { 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->source_w_reg = c->nr_payload_regs; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->nr_payload_regs++; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->dispatch_width == 16) { 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R30: interpolated W if not 8-wide. */ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->nr_payload_regs++; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R31: MSAA position offsets. */ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R32-: bary for 32-pixel. */ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R58-59: interp W for 32-pixel. */ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->fp->program.Base.OutputsWritten & 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->source_depth_to_render_target = true; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->computes_depth = true; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_lookup_iz(intel, c); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Mesa program -> GPU code generation goes through this function. 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Depending on the instructions used (i.e. flow control instructions) 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we'll use one of two code generators. 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool do_wm_prog(struct brw_context *brw, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_shader_program *prog, 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_fragment_program *fp, 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_wm_prog_key *key) 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_wm_compile *c; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *program; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint program_size; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = brw->wm.compile_data; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c == NULL) { 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->wm.compile_data = rzalloc(NULL, struct brw_wm_compile); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = brw->wm.compile_data; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c == NULL) { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ouch - big out of memory problem. Can't continue 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without triggering a segfault, no way to signal, 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so just return. 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *instruction = c->instruction; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *prog_instructions = c->prog_instructions; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *vreg = c->vreg; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *refs = c->refs; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(c, 0, sizeof(*brw->wm.compile_data)); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->instruction = instruction; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->prog_instructions = prog_instructions; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vreg = vreg; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->refs = refs; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&c->key, key, sizeof(*key)); 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->fp = fp; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->env_param = brw->intel.ctx.FragmentProgram.Parameters; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_init_compile(brw, &c->func, c); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->prog_data.barycentric_interp_modes = 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_compute_barycentric_interp_modes(brw, c->key.flat_shade, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &fp->program); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog && prog->_LinkedShaders[MESA_SHADER_FRAGMENT]) { 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!brw_wm_fs_emit(brw, c, prog)) 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c->instruction) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->instruction = rzalloc_array(c, struct brw_wm_instruction, BRW_WM_MAX_INSN); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->prog_instructions = rzalloc_array(c, struct prog_instruction, BRW_WM_MAX_INSN); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->vreg = rzalloc_array(c, struct brw_wm_value, BRW_WM_MAX_VREG); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->refs = rzalloc_array(c, struct brw_wm_ref, BRW_WM_MAX_REF); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fallback for fixed function and ARB_fp shaders. */ 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->dispatch_width = 16; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_payload_setup(brw, c); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_non_glsl_emit(brw, c); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->prog_data.dispatch_width = 16; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Scratch space is used for register spilling */ 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->last_scratch) { 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perf_debug("Fragment shader triggered register spilling. " 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Try reducing the number of live scalar values to " 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "improve performance.\n"); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->prog_data.total_scratch = brw_get_scratch_size(c->last_scratch); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_get_scratch_bo(intel, &brw->wm.scratch_bo, 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->prog_data.total_scratch * brw->max_wm_threads); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(INTEL_DEBUG & DEBUG_WM)) 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "\n"); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get the program 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program = brw_get_program(&c->func, &program_size); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_upload_cache(&brw->cache, BRW_WM_PROG, 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &c->key, sizeof(c->key), 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program, program_size, 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &c->prog_data, sizeof(c->prog_data), 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &brw->wm.prog_offset, &brw->wm.prog_data); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgkey_debug(const char *name, int a, int b) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (a != b) { 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perf_debug(" %s %d->%d\n", name, a, b); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_debug_recompile_sampler_key(const struct brw_sampler_prog_key_data *old_key, 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct brw_sampler_prog_key_data *key) 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool found = false; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int i = 0; i < MAX_SAMPLERS; i++) { 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("EXT_texture_swizzle or DEPTH_TEXTURE_MODE", 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key->swizzles[i], key->swizzles[i]); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("GL_CLAMP enabled on any texture unit's 1st coordinate", 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key->gl_clamp_mask[0], key->gl_clamp_mask[0]); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("GL_CLAMP enabled on any texture unit's 2nd coordinate", 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key->gl_clamp_mask[1], key->gl_clamp_mask[1]); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("GL_CLAMP enabled on any texture unit's 3rd coordinate", 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key->gl_clamp_mask[2], key->gl_clamp_mask[2]); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("GL_MESA_ycbcr texturing\n", 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key->yuvtex_mask, key->yuvtex_mask); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("GL_MESA_ycbcr UV swapping\n", 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key->yuvtex_swap_mask, key->yuvtex_swap_mask); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return found; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_wm_debug_recompile(struct brw_context *brw, 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_shader_program *prog, 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct brw_wm_prog_key *key) 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_cache_item *c = NULL; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct brw_wm_prog_key *old_key = NULL; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool found = false; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perf_debug("Recompiling fragment shader for program %d\n", prog->Name); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int i = 0; i < brw->cache.size; i++) { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = brw->cache.items[i]; c; c = c->next) { 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->cache_id == BRW_WM_PROG) { 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key = c->key; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old_key->program_string_id == key->program_string_id) 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c) 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c) { 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perf_debug(" Didn't find previous compile in the shader cache for " 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "debug\n"); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("alphatest, computed depth, depth test, or depth write", 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_key->iz_lookup, key->iz_lookup); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("depth statistics", old_key->stats_wm, key->stats_wm); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("flat shading", old_key->flat_shade, key->flat_shade); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("number of color buffers", old_key->nr_color_regions, key->nr_color_regions); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("rendering to FBO", old_key->render_to_fbo, key->render_to_fbo); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("fragment color clamping", old_key->clamp_fragment_color, key->clamp_fragment_color); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("line smoothing", old_key->line_aa, key->line_aa); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("proj_attrib_mask", old_key->proj_attrib_mask, key->proj_attrib_mask); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("renderbuffer height", old_key->drawable_height, key->drawable_height); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= key_debug("vertex shader outputs", old_key->vp_outputs_written, key->vp_outputs_written); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org found |= brw_debug_recompile_sampler_key(&old_key->tex, &key->tex); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!found) { 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perf_debug(" Something else\n"); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_populate_sampler_prog_key_data(struct gl_context *ctx, 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_program *prog, 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_sampler_prog_key_data *key) 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = intel_context(ctx); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 0; s < MAX_SAMPLERS; s++) { 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->swizzles[s] = SWIZZLE_NOOP; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(prog->SamplersUsed & (1 << s))) 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int unit_id = prog->SamplerUnits[s]; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_unit *unit = &ctx->Texture.Unit[unit_id]; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unit->_ReallyEnabled && unit->_Current->Target != GL_TEXTURE_BUFFER) { 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_object *t = unit->_Current; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_image *img = t->Image[0][t->BaseLevel]; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit_id); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool alpha_depth = t->DepthMode == GL_ALPHA && 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (img->_BaseFormat == GL_DEPTH_COMPONENT || 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->_BaseFormat == GL_DEPTH_STENCIL); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Haswell handles texture swizzling as surface format overrides 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (except for GL_ALPHA); all other platforms need MOVs in the shader. 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!intel->is_haswell || alpha_depth) 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->swizzles[s] = brw_get_texture_swizzle(t); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img->InternalFormat == GL_YCBCR_MESA) { 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->yuvtex_mask |= 1 << s; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img->TexFormat == MESA_FORMAT_YCBCR) 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->yuvtex_swap_mask |= 1 << s; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sampler->MinFilter != GL_NEAREST && 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sampler->MagFilter != GL_NEAREST) { 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sampler->WrapS == GL_CLAMP) 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->gl_clamp_mask[0] |= 1 << s; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sampler->WrapT == GL_CLAMP) 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->gl_clamp_mask[1] |= 1 << s; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sampler->WrapR == GL_CLAMP) 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->gl_clamp_mask[2] |= 1 << s; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void brw_wm_populate_key( struct brw_context *brw, 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_wm_prog_key *key ) 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &brw->intel.ctx; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BRW_NEW_FRAGMENT_PROGRAM */ 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct brw_fragment_program *fp = 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct brw_fragment_program *)brw->fragment_program; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_program *prog = (struct gl_program *) brw->fragment_program; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint lookup = 0; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint line_aa; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool program_uses_dfdy = fp->program.UsesDFdy; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(key, 0, sizeof(*key)); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Build the index for table lookup 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) { 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_COLOR */ 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fp->program.UsesKill || ctx->Color.AlphaEnabled) 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lookup |= IZ_PS_KILL_ALPHATEST_BIT; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lookup |= IZ_PS_COMPUTES_DEPTH_BIT; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_DEPTH */ 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Depth.Test) 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lookup |= IZ_DEPTH_TEST_ENABLE_BIT; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Depth.Test && ctx->Depth.Mask) /* ?? */ 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lookup |= IZ_DEPTH_WRITE_ENABLE_BIT; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_STENCIL */ 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Stencil._Enabled) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lookup |= IZ_STENCIL_TEST_ENABLE_BIT; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Stencil.WriteMask[0] || 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Stencil.WriteMask[ctx->Stencil._BackFace]) 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lookup |= IZ_STENCIL_WRITE_ENABLE_BIT; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->iz_lookup = lookup; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org line_aa = AA_NEVER; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_LINE, _NEW_POLYGON, BRW_NEW_REDUCED_PRIMITIVE */ 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.SmoothFlag) { 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (brw->intel.reduced_primitive == GL_LINES) { 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org line_aa = AA_ALWAYS; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (brw->intel.reduced_primitive == GL_TRIANGLES) { 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.FrontMode == GL_LINE) { 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org line_aa = AA_SOMETIMES; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.BackMode == GL_LINE || 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->Polygon.CullFlag && 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.CullFaceMode == GL_BACK)) 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org line_aa = AA_ALWAYS; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Polygon.BackMode == GL_LINE) { 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org line_aa = AA_SOMETIMES; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((ctx->Polygon.CullFlag && 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.CullFaceMode == GL_FRONT)) 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org line_aa = AA_ALWAYS; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->line_aa = line_aa; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->stats_wm = brw->intel.stats_wm; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BRW_NEW_WM_INPUT_DIMENSIONS */ 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Only set this for fixed function. The optimization it enables isn't 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * useful for programs using shaders. 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Shader.CurrentFragmentProgram) 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->proj_attrib_mask = 0xffffffff; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->proj_attrib_mask = brw->wm.input_size_masks[4-1]; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_LIGHT */ 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->flat_shade = (ctx->Light.ShadeModel == GL_FLAT); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_FRAG_CLAMP | _NEW_BUFFERS */ 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->clamp_fragment_color = ctx->Color._ClampFragmentColor; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_TEXTURE */ 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_populate_sampler_prog_key_data(ctx, prog, &key->tex); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_BUFFERS */ 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Include the draw buffer origin and height so that we can calculate 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment position values relative to the bottom left of the drawable, 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from the incoming screen origin relative position we get as part of our 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * payload. 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is only needed for the WM_WPOSXY opcode when the fragment program 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * uses the gl_FragCoord input. 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We could avoid recompiling by including this as a constant referenced by 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * our program, but if we were to do that it would also be nice to handle 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * getting that constant updated at batchbuffer submit time (when we 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * hold the lock and know where the buffer really is) rather than at emit 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * time when we don't hold the lock and are just guessing. We could also 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * just avoid using this as key data if the program doesn't use 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment.position. 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For DRI2 the origin_x/y will always be (0,0) but we still need the 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * drawable height in order to invert the Y axis. 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fp->program.Base.InputsRead & FRAG_BIT_WPOS) { 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->drawable_height = ctx->DrawBuffer->Height; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((fp->program.Base.InputsRead & FRAG_BIT_WPOS) || program_uses_dfdy) { 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_BUFFERS */ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _NEW_MULTISAMPLE */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->sample_alpha_to_coverage = ctx->Multisample.SampleAlphaToCoverage; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* CACHE_NEW_VS_PROG */ 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intel->gen < 6) 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->vp_outputs_written = brw->vs.prog_data->outputs_written; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The unique fragment program ID */ 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->program_string_id = fp->id; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrw_upload_wm_prog(struct brw_context *brw) 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct intel_context *intel = &brw->intel; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &intel->ctx; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_wm_prog_key key; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct brw_fragment_program *fp = (struct brw_fragment_program *) 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw->fragment_program; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org brw_wm_populate_key(brw, &key); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!brw_search_cache(&brw->cache, BRW_WM_PROG, 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &key, sizeof(key), 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &brw->wm.prog_offset, &brw->wm.prog_data)) { 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool success = do_wm_prog(brw, ctx->Shader._CurrentFragmentProgram, fp, 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &key); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) success; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(success); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct brw_tracked_state brw_wm_prog = { 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .dirty = { 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .mesa = (_NEW_COLOR | 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_DEPTH | 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_STENCIL | 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_POLYGON | 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_LINE | 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_LIGHT | 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_FRAG_CLAMP | 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_BUFFERS | 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_TEXTURE | 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _NEW_MULTISAMPLE), 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .brw = (BRW_NEW_FRAGMENT_PROGRAM | 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_NEW_WM_INPUT_DIMENSIONS | 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BRW_NEW_REDUCED_PRIMITIVE), 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .cache = CACHE_NEW_VS_PROG, 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .emit = brw_upload_wm_prog 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661