112c18ce4763d3982a52318365f45c4535aac0567Rob Clark/* 212c18ce4763d3982a52318365f45c4535aac0567Rob Clark * Copyright © 2015 Red Hat 312c18ce4763d3982a52318365f45c4535aac0567Rob Clark * 412c18ce4763d3982a52318365f45c4535aac0567Rob Clark * Permission is hereby granted, free of charge, to any person obtaining a 512c18ce4763d3982a52318365f45c4535aac0567Rob Clark * copy of this software and associated documentation files (the "Software"), 612c18ce4763d3982a52318365f45c4535aac0567Rob Clark * to deal in the Software without restriction, including without limitation 712c18ce4763d3982a52318365f45c4535aac0567Rob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense, 812c18ce4763d3982a52318365f45c4535aac0567Rob Clark * and/or sell copies of the Software, and to permit persons to whom the 912c18ce4763d3982a52318365f45c4535aac0567Rob Clark * Software is furnished to do so, subject to the following conditions: 1012c18ce4763d3982a52318365f45c4535aac0567Rob Clark * 1112c18ce4763d3982a52318365f45c4535aac0567Rob Clark * The above copyright notice and this permission notice (including the next 1212c18ce4763d3982a52318365f45c4535aac0567Rob Clark * paragraph) shall be included in all copies or substantial portions of the 1312c18ce4763d3982a52318365f45c4535aac0567Rob Clark * Software. 1412c18ce4763d3982a52318365f45c4535aac0567Rob Clark * 1512c18ce4763d3982a52318365f45c4535aac0567Rob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1612c18ce4763d3982a52318365f45c4535aac0567Rob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1712c18ce4763d3982a52318365f45c4535aac0567Rob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1812c18ce4763d3982a52318365f45c4535aac0567Rob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1912c18ce4763d3982a52318365f45c4535aac0567Rob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2012c18ce4763d3982a52318365f45c4535aac0567Rob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 2112c18ce4763d3982a52318365f45c4535aac0567Rob Clark * SOFTWARE. 2212c18ce4763d3982a52318365f45c4535aac0567Rob Clark */ 2312c18ce4763d3982a52318365f45c4535aac0567Rob Clark 2412c18ce4763d3982a52318365f45c4535aac0567Rob Clark#include "nir.h" 2512c18ce4763d3982a52318365f45c4535aac0567Rob Clark#include "nir_builder.h" 2612c18ce4763d3982a52318365f45c4535aac0567Rob Clark 2712c18ce4763d3982a52318365f45c4535aac0567Rob Clark/* Lower glDrawPixels(). 2812c18ce4763d3982a52318365f45c4535aac0567Rob Clark * 2912c18ce4763d3982a52318365f45c4535aac0567Rob Clark * This is based on the logic in st_get_drawpix_shader() in TGSI compiler. 3012c18ce4763d3982a52318365f45c4535aac0567Rob Clark * 3112c18ce4763d3982a52318365f45c4535aac0567Rob Clark * Run before nir_lower_io. 3212c18ce4763d3982a52318365f45c4535aac0567Rob Clark */ 3312c18ce4763d3982a52318365f45c4535aac0567Rob Clark 3412c18ce4763d3982a52318365f45c4535aac0567Rob Clarktypedef struct { 3512c18ce4763d3982a52318365f45c4535aac0567Rob Clark const nir_lower_drawpixels_options *options; 3612c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_shader *shader; 3712c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_builder b; 3812c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_variable *texcoord, *scale, *bias; 3912c18ce4763d3982a52318365f45c4535aac0567Rob Clark} lower_drawpixels_state; 4012c18ce4763d3982a52318365f45c4535aac0567Rob Clark 4112c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic nir_ssa_def * 4212c18ce4763d3982a52318365f45c4535aac0567Rob Clarkget_texcoord(lower_drawpixels_state *state) 4312c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 4412c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (state->texcoord == NULL) { 4512c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_variable *texcoord = NULL; 4612c18ce4763d3982a52318365f45c4535aac0567Rob Clark 4712c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* find gl_TexCoord, if it exists: */ 4812c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_foreach_variable(var, &state->shader->inputs) { 4912c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (var->data.location == VARYING_SLOT_TEX0) { 5012c18ce4763d3982a52318365f45c4535aac0567Rob Clark texcoord = var; 5112c18ce4763d3982a52318365f45c4535aac0567Rob Clark break; 5212c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 5312c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 5412c18ce4763d3982a52318365f45c4535aac0567Rob Clark 5512c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* otherwise create it: */ 5612c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (texcoord == NULL) { 5712c18ce4763d3982a52318365f45c4535aac0567Rob Clark texcoord = nir_variable_create(state->shader, 5812c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_var_shader_in, 5912c18ce4763d3982a52318365f45c4535aac0567Rob Clark glsl_vec4_type(), 6012c18ce4763d3982a52318365f45c4535aac0567Rob Clark "gl_TexCoord"); 6112c18ce4763d3982a52318365f45c4535aac0567Rob Clark texcoord->data.location = VARYING_SLOT_TEX0; 6212c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 6312c18ce4763d3982a52318365f45c4535aac0567Rob Clark 6412c18ce4763d3982a52318365f45c4535aac0567Rob Clark state->texcoord = texcoord; 6512c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 6612c18ce4763d3982a52318365f45c4535aac0567Rob Clark return nir_load_var(&state->b, state->texcoord); 6712c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 6812c18ce4763d3982a52318365f45c4535aac0567Rob Clark 6912c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic nir_variable * 7012c18ce4763d3982a52318365f45c4535aac0567Rob Clarkcreate_uniform(nir_shader *shader, const char *name, const int state_tokens[5]) 7112c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 7212c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_variable *var = nir_variable_create(shader, 7312c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_var_uniform, 7412c18ce4763d3982a52318365f45c4535aac0567Rob Clark glsl_vec4_type(), 7512c18ce4763d3982a52318365f45c4535aac0567Rob Clark name); 7612c18ce4763d3982a52318365f45c4535aac0567Rob Clark var->num_state_slots = 1; 7712c18ce4763d3982a52318365f45c4535aac0567Rob Clark var->state_slots = ralloc_array(var, nir_state_slot, 1); 7812c18ce4763d3982a52318365f45c4535aac0567Rob Clark memcpy(var->state_slots[0].tokens, state_tokens, 7912c18ce4763d3982a52318365f45c4535aac0567Rob Clark sizeof(var->state_slots[0].tokens)); 8012c18ce4763d3982a52318365f45c4535aac0567Rob Clark return var; 8112c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 8212c18ce4763d3982a52318365f45c4535aac0567Rob Clark 8312c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic nir_ssa_def * 8412c18ce4763d3982a52318365f45c4535aac0567Rob Clarkget_scale(lower_drawpixels_state *state) 8512c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 8612c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (state->scale == NULL) { 8712c18ce4763d3982a52318365f45c4535aac0567Rob Clark state->scale = create_uniform(state->shader, "gl_PTscale", 8812c18ce4763d3982a52318365f45c4535aac0567Rob Clark state->options->scale_state_tokens); 8912c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 9012c18ce4763d3982a52318365f45c4535aac0567Rob Clark return nir_load_var(&state->b, state->scale); 9112c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 9212c18ce4763d3982a52318365f45c4535aac0567Rob Clark 9312c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic nir_ssa_def * 9412c18ce4763d3982a52318365f45c4535aac0567Rob Clarkget_bias(lower_drawpixels_state *state) 9512c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 9612c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (state->bias == NULL) { 9712c18ce4763d3982a52318365f45c4535aac0567Rob Clark state->bias = create_uniform(state->shader, "gl_PTbias", 9812c18ce4763d3982a52318365f45c4535aac0567Rob Clark state->options->bias_state_tokens); 9912c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 10012c18ce4763d3982a52318365f45c4535aac0567Rob Clark return nir_load_var(&state->b, state->bias); 10112c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 10212c18ce4763d3982a52318365f45c4535aac0567Rob Clark 10312c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic nir_ssa_def * 10412c18ce4763d3982a52318365f45c4535aac0567Rob Clarkget_texcoord_const(lower_drawpixels_state *state) 10512c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 10612c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (state->bias == NULL) { 10712c18ce4763d3982a52318365f45c4535aac0567Rob Clark state->bias = create_uniform(state->shader, "gl_MultiTexCoord0", 10812c18ce4763d3982a52318365f45c4535aac0567Rob Clark state->options->texcoord_state_tokens); 10912c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 11012c18ce4763d3982a52318365f45c4535aac0567Rob Clark return nir_load_var(&state->b, state->bias); 11112c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 11212c18ce4763d3982a52318365f45c4535aac0567Rob Clark 11312c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic void 11412c18ce4763d3982a52318365f45c4535aac0567Rob Clarklower_color(lower_drawpixels_state *state, nir_intrinsic_instr *intr) 11512c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 11612c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_builder *b = &state->b; 11712c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_def *texcoord; 11812c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_tex_instr *tex; 11912c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_def *def; 12012c18ce4763d3982a52318365f45c4535aac0567Rob Clark 12112c18ce4763d3982a52318365f45c4535aac0567Rob Clark assert(intr->dest.is_ssa); 12212c18ce4763d3982a52318365f45c4535aac0567Rob Clark 12312c18ce4763d3982a52318365f45c4535aac0567Rob Clark b->cursor = nir_before_instr(&intr->instr); 12412c18ce4763d3982a52318365f45c4535aac0567Rob Clark 12512c18ce4763d3982a52318365f45c4535aac0567Rob Clark texcoord = get_texcoord(state); 12612c18ce4763d3982a52318365f45c4535aac0567Rob Clark 12712c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* replace load_var(gl_Color) w/ texture sample: 12812c18ce4763d3982a52318365f45c4535aac0567Rob Clark * TEX def, texcoord, drawpix_sampler, 2D 12912c18ce4763d3982a52318365f45c4535aac0567Rob Clark */ 13012c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex = nir_tex_instr_create(state->shader, 1); 13112c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->op = nir_texop_tex; 13212c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->sampler_dim = GLSL_SAMPLER_DIM_2D; 13312c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->coord_components = 2; 13412c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->sampler_index = state->options->drawpix_sampler; 13512c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->texture_index = state->options->drawpix_sampler; 13612c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->dest_type = nir_type_float; 13749936364e4c48e318b1ef3f09785b0e669a0c11bEric Anholt tex->src[0].src_type = nir_tex_src_coord; 13812c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->src[0].src = nir_src_for_ssa(texcoord); 13912c18ce4763d3982a52318365f45c4535aac0567Rob Clark 14012c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, NULL); 14112c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_builder_instr_insert(b, &tex->instr); 14212c18ce4763d3982a52318365f45c4535aac0567Rob Clark def = &tex->dest.ssa; 14312c18ce4763d3982a52318365f45c4535aac0567Rob Clark 14412c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* Apply the scale and bias. */ 14512c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (state->options->scale_and_bias) { 14612c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* MAD def, def, scale, bias; */ 14712c18ce4763d3982a52318365f45c4535aac0567Rob Clark def = nir_ffma(b, def, get_scale(state), get_bias(state)); 14812c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 14912c18ce4763d3982a52318365f45c4535aac0567Rob Clark 15012c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (state->options->pixel_maps) { 15112c18ce4763d3982a52318365f45c4535aac0567Rob Clark static const unsigned swiz_xy[4] = {0,1}; 15212c18ce4763d3982a52318365f45c4535aac0567Rob Clark static const unsigned swiz_zw[4] = {2,3}; 15312c18ce4763d3982a52318365f45c4535aac0567Rob Clark 15412c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* do four pixel map look-ups with two TEX instructions: */ 15512c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_def *def_xy, *def_zw; 15612c18ce4763d3982a52318365f45c4535aac0567Rob Clark 15712c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* TEX def.xy, def.xyyy, pixelmap_sampler, 2D; */ 15812c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex = nir_tex_instr_create(state->shader, 1); 15912c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->op = nir_texop_tex; 16012c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->sampler_dim = GLSL_SAMPLER_DIM_2D; 16112c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->coord_components = 2; 16212c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->sampler_index = state->options->pixelmap_sampler; 16312c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->texture_index = state->options->pixelmap_sampler; 16412c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->dest_type = nir_type_float; 16549936364e4c48e318b1ef3f09785b0e669a0c11bEric Anholt tex->src[0].src_type = nir_tex_src_coord; 16612c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->src[0].src = nir_src_for_ssa(nir_swizzle(b, def, swiz_xy, 2, true)); 16712c18ce4763d3982a52318365f45c4535aac0567Rob Clark 16812c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, NULL); 16912c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_builder_instr_insert(b, &tex->instr); 17012c18ce4763d3982a52318365f45c4535aac0567Rob Clark def_xy = &tex->dest.ssa; 17112c18ce4763d3982a52318365f45c4535aac0567Rob Clark 17212c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* TEX def.zw, def.zwww, pixelmap_sampler, 2D; */ 17312c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex = nir_tex_instr_create(state->shader, 1); 17412c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->op = nir_texop_tex; 17512c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->sampler_dim = GLSL_SAMPLER_DIM_2D; 17612c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->coord_components = 2; 17712c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->sampler_index = state->options->pixelmap_sampler; 17812c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->dest_type = nir_type_float; 17949936364e4c48e318b1ef3f09785b0e669a0c11bEric Anholt tex->src[0].src_type = nir_tex_src_coord; 18012c18ce4763d3982a52318365f45c4535aac0567Rob Clark tex->src[0].src = nir_src_for_ssa(nir_swizzle(b, def, swiz_zw, 2, true)); 18112c18ce4763d3982a52318365f45c4535aac0567Rob Clark 18212c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, NULL); 18312c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_builder_instr_insert(b, &tex->instr); 18412c18ce4763d3982a52318365f45c4535aac0567Rob Clark def_zw = &tex->dest.ssa; 18512c18ce4763d3982a52318365f45c4535aac0567Rob Clark 18612c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* def = vec4(def.xy, def.zw); */ 18712c18ce4763d3982a52318365f45c4535aac0567Rob Clark def = nir_vec4(b, 18812c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_channel(b, def_xy, 0), 18912c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_channel(b, def_xy, 1), 19012c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_channel(b, def_zw, 0), 19112c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_channel(b, def_zw, 1)); 19212c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 19312c18ce4763d3982a52318365f45c4535aac0567Rob Clark 19412c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_def_rewrite_uses(&intr->dest.ssa, nir_src_for_ssa(def)); 19512c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 19612c18ce4763d3982a52318365f45c4535aac0567Rob Clark 19712c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic void 19812c18ce4763d3982a52318365f45c4535aac0567Rob Clarklower_texcoord(lower_drawpixels_state *state, nir_intrinsic_instr *intr) 19912c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 2003ef1853f7d75eb5235dc1a425374b67c42a4eb65Eric Anholt state->b.cursor = nir_before_instr(&intr->instr); 2013ef1853f7d75eb5235dc1a425374b67c42a4eb65Eric Anholt 20212c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_def *texcoord_const = get_texcoord_const(state); 20312c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_ssa_def_rewrite_uses(&intr->dest.ssa, nir_src_for_ssa(texcoord_const)); 20412c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 20512c18ce4763d3982a52318365f45c4535aac0567Rob Clark 20612c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic bool 20712c18ce4763d3982a52318365f45c4535aac0567Rob Clarklower_drawpixels_block(lower_drawpixels_state *state, nir_block *block) 20812c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 20912c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_foreach_instr_safe(instr, block) { 21012c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (instr->type == nir_instr_type_intrinsic) { 21112c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); 21212c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (intr->intrinsic == nir_intrinsic_load_var) { 21312c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_deref_var *dvar = intr->variables[0]; 21412c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_variable *var = dvar->var; 21512c18ce4763d3982a52318365f45c4535aac0567Rob Clark 21612c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (var->data.location == VARYING_SLOT_COL0) { 2170a8ff1681b4149b50956791c5b080ab5753447adEric Anholt /* gl_Color should not have array/struct deref's: */ 21812c18ce4763d3982a52318365f45c4535aac0567Rob Clark assert(dvar->deref.child == NULL); 21912c18ce4763d3982a52318365f45c4535aac0567Rob Clark lower_color(state, intr); 22012c18ce4763d3982a52318365f45c4535aac0567Rob Clark } else if (var->data.location == VARYING_SLOT_TEX0) { 22112c18ce4763d3982a52318365f45c4535aac0567Rob Clark /* gl_TexCoord should not have array/struct deref's: */ 22212c18ce4763d3982a52318365f45c4535aac0567Rob Clark assert(dvar->deref.child == NULL); 22312c18ce4763d3982a52318365f45c4535aac0567Rob Clark lower_texcoord(state, intr); 22412c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 22512c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 22612c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 22712c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 22812c18ce4763d3982a52318365f45c4535aac0567Rob Clark 22912c18ce4763d3982a52318365f45c4535aac0567Rob Clark return true; 23012c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 23112c18ce4763d3982a52318365f45c4535aac0567Rob Clark 23212c18ce4763d3982a52318365f45c4535aac0567Rob Clarkstatic void 23312c18ce4763d3982a52318365f45c4535aac0567Rob Clarklower_drawpixels_impl(lower_drawpixels_state *state, nir_function_impl *impl) 23412c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 23512c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_builder_init(&state->b, impl); 23612c18ce4763d3982a52318365f45c4535aac0567Rob Clark 23712c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_foreach_block(block, impl) { 23812c18ce4763d3982a52318365f45c4535aac0567Rob Clark lower_drawpixels_block(state, block); 23912c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 24012c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_metadata_preserve(impl, nir_metadata_block_index | 24112c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_metadata_dominance); 24212c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 24312c18ce4763d3982a52318365f45c4535aac0567Rob Clark 24412c18ce4763d3982a52318365f45c4535aac0567Rob Clarkvoid 24512c18ce4763d3982a52318365f45c4535aac0567Rob Clarknir_lower_drawpixels(nir_shader *shader, 24612c18ce4763d3982a52318365f45c4535aac0567Rob Clark const nir_lower_drawpixels_options *options) 24712c18ce4763d3982a52318365f45c4535aac0567Rob Clark{ 24812c18ce4763d3982a52318365f45c4535aac0567Rob Clark lower_drawpixels_state state = { 24912c18ce4763d3982a52318365f45c4535aac0567Rob Clark .options = options, 25012c18ce4763d3982a52318365f45c4535aac0567Rob Clark .shader = shader, 25112c18ce4763d3982a52318365f45c4535aac0567Rob Clark }; 25212c18ce4763d3982a52318365f45c4535aac0567Rob Clark 25312c18ce4763d3982a52318365f45c4535aac0567Rob Clark assert(shader->stage == MESA_SHADER_FRAGMENT); 25412c18ce4763d3982a52318365f45c4535aac0567Rob Clark 25512c18ce4763d3982a52318365f45c4535aac0567Rob Clark nir_foreach_function(function, shader) { 25612c18ce4763d3982a52318365f45c4535aac0567Rob Clark if (function->impl) 25712c18ce4763d3982a52318365f45c4535aac0567Rob Clark lower_drawpixels_impl(&state, function->impl); 25812c18ce4763d3982a52318365f45c4535aac0567Rob Clark } 25912c18ce4763d3982a52318365f45c4535aac0567Rob Clark} 260