X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_tgsi_decl_sm30.c;h=5e0f52bd8992ae27f855ab69949fe97f68941ede;hb=4379dcc12d36bf9993a06c628c9426d4f54ba58d;hp=7faa275f33ea350726f668832e64841292c10adf;hpb=1f57349e20883346855752d3dfbcc74e9b6b0c1a;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c b/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c index 7faa275f33e..5e0f52bd899 100644 --- a/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c +++ b/src/gallium/drivers/svga/svga_tgsi_decl_sm30.c @@ -42,11 +42,11 @@ translate_vs_ps_semantic(struct svga_shader_emitter *emit, unsigned *idx) { switch (semantic.Name) { - case TGSI_SEMANTIC_POSITION: + case TGSI_SEMANTIC_POSITION: *idx = semantic.Index; *usage = SVGA3D_DECLUSAGE_POSITION; break; - case TGSI_SEMANTIC_COLOR: + case TGSI_SEMANTIC_COLOR: *idx = semantic.Index; *usage = SVGA3D_DECLUSAGE_COLOR; break; @@ -54,21 +54,21 @@ translate_vs_ps_semantic(struct svga_shader_emitter *emit, *idx = semantic.Index + 2; /* sharing with COLOR */ *usage = SVGA3D_DECLUSAGE_COLOR; break; - case TGSI_SEMANTIC_FOG: + case TGSI_SEMANTIC_FOG: *idx = 0; assert(semantic.Index == 0); *usage = SVGA3D_DECLUSAGE_TEXCOORD; break; - case TGSI_SEMANTIC_PSIZE: + case TGSI_SEMANTIC_PSIZE: *idx = semantic.Index; *usage = SVGA3D_DECLUSAGE_PSIZE; break; - case TGSI_SEMANTIC_GENERIC: + case TGSI_SEMANTIC_GENERIC: *idx = svga_remap_generic_index(emit->key.generic_remap_table, semantic.Index); *usage = SVGA3D_DECLUSAGE_TEXCOORD; break; - case TGSI_SEMANTIC_NORMAL: + case TGSI_SEMANTIC_NORMAL: *idx = semantic.Index; *usage = SVGA3D_DECLUSAGE_NORMAL; break; @@ -98,7 +98,7 @@ translate_vs_ps_semantic(struct svga_shader_emitter *emit, static boolean emit_decl(struct svga_shader_emitter *emit, SVGA3dShaderDestToken reg, - unsigned usage, + unsigned usage, unsigned index) { SVGA3DOpDclArgs dcl; @@ -108,7 +108,7 @@ emit_decl(struct svga_shader_emitter *emit, assert(index < 16); assert(usage <= SVGA3D_DECLUSAGE_MAX); - opcode = inst_token( SVGA3DOP_DCL ); + opcode = inst_token(SVGA3DOP_DCL); dcl.values[0] = 0; dcl.values[1] = 0; @@ -118,7 +118,7 @@ emit_decl(struct svga_shader_emitter *emit, dcl.values[0] |= 1<<31; return (emit_instruction(emit, opcode) && - svga_shader_emit_dwords( emit, dcl.values, Elements(dcl.values))); + svga_shader_emit_dwords(emit, dcl.values, ARRAY_SIZE(dcl.values))); } @@ -132,7 +132,7 @@ emit_vface_decl(struct svga_shader_emitter *emit) SVGA3dShaderDestToken reg = dst_register(SVGA3DREG_MISCTYPE, SVGA3DMISCREG_FACE); - if (!emit_decl( emit, reg, 0, 0 )) + if (!emit_decl(emit, reg, 0, 0)) return FALSE; emit->emitted_vface = TRUE; @@ -146,8 +146,8 @@ emit_vface_decl(struct svga_shader_emitter *emit) * Note that this always goes into texcoord[0]. */ static boolean -ps30_input_emit_depth_fog( struct svga_shader_emitter *emit, - struct src_register *out ) +ps30_input_emit_depth_fog(struct svga_shader_emitter *emit, + struct src_register *out) { struct src_register reg; @@ -159,14 +159,14 @@ ps30_input_emit_depth_fog( struct svga_shader_emitter *emit, if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX) return FALSE; - reg = src_register( SVGA3DREG_INPUT, - emit->ps30_input_count++ ); + reg = src_register(SVGA3DREG_INPUT, + emit->ps30_input_count++); *out = emit->ps_depth_fog = reg; emit->emitted_depth_fog = TRUE; - return emit_decl( emit, dst( reg ), SVGA3D_DECLUSAGE_TEXCOORD, 0 ); + return emit_decl(emit, dst(reg), SVGA3D_DECLUSAGE_TEXCOORD, 0); } @@ -184,73 +184,74 @@ ps30_input(struct svga_shader_emitter *emit, if (semantic.Name == TGSI_SEMANTIC_POSITION) { - emit->ps_true_pos = src_register( SVGA3DREG_MISCTYPE, - SVGA3DMISCREG_POSITION ); - emit->ps_true_pos.base.swizzle = TRANSLATE_SWIZZLE( TGSI_SWIZZLE_X, + emit->ps_true_pos = src_register(SVGA3DREG_MISCTYPE, + SVGA3DMISCREG_POSITION); + emit->ps_true_pos.base.swizzle = TRANSLATE_SWIZZLE(TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Y, - TGSI_SWIZZLE_Y ); - reg = writemask( dst(emit->ps_true_pos), - TGSI_WRITEMASK_XY ); + TGSI_SWIZZLE_Y); + reg = writemask(dst(emit->ps_true_pos), + TGSI_WRITEMASK_XY); emit->ps_reads_pos = TRUE; if (emit->info.reads_z) { - emit->ps_temp_pos = dst_register( SVGA3DREG_TEMP, - emit->nr_hw_temp ); + emit->ps_temp_pos = dst_register(SVGA3DREG_TEMP, + emit->nr_hw_temp); - emit->input_map[idx] = src_register( SVGA3DREG_TEMP, - emit->nr_hw_temp ); + emit->input_map[idx] = src_register(SVGA3DREG_TEMP, + emit->nr_hw_temp); emit->nr_hw_temp++; - if (!ps30_input_emit_depth_fog( emit, &emit->ps_depth_pos )) + if (!ps30_input_emit_depth_fog(emit, &emit->ps_depth_pos)) return FALSE; - emit->ps_depth_pos.base.swizzle = TRANSLATE_SWIZZLE( TGSI_SWIZZLE_Z, + emit->ps_depth_pos.base.swizzle = TRANSLATE_SWIZZLE(TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, - TGSI_SWIZZLE_W ); + TGSI_SWIZZLE_W); } else { emit->input_map[idx] = emit->ps_true_pos; } - return emit_decl( emit, reg, 0, 0 ); + return emit_decl(emit, reg, 0, 0); } - else if (emit->key.fkey.light_twoside && + else if (emit->key.fs.light_twoside && (semantic.Name == TGSI_SEMANTIC_COLOR)) { - if (!translate_vs_ps_semantic( emit, semantic, &usage, &index )) + if (!translate_vs_ps_semantic(emit, semantic, &usage, &index)) return FALSE; emit->internal_color_idx[emit->internal_color_count] = idx; - emit->input_map[idx] = src_register( SVGA3DREG_INPUT, emit->ps30_input_count ); + emit->input_map[idx] = + src_register(SVGA3DREG_INPUT, emit->ps30_input_count); emit->ps30_input_count++; emit->internal_color_count++; - reg = dst( emit->input_map[idx] ); + reg = dst(emit->input_map[idx]); - if (!emit_decl( emit, reg, usage, index )) + if (!emit_decl(emit, reg, usage, index)) return FALSE; semantic.Name = TGSI_SEMANTIC_BCOLOR; - if (!translate_vs_ps_semantic( emit, semantic, &usage, &index )) + if (!translate_vs_ps_semantic(emit, semantic, &usage, &index)) return FALSE; if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX) return FALSE; - reg = dst_register( SVGA3DREG_INPUT, emit->ps30_input_count++ ); + reg = dst_register(SVGA3DREG_INPUT, emit->ps30_input_count++); - if (!emit_decl( emit, reg, usage, index )) + if (!emit_decl(emit, reg, usage, index)) return FALSE; - if (!emit_vface_decl( emit )) + if (!emit_vface_decl(emit)) return FALSE; return TRUE; } else if (semantic.Name == TGSI_SEMANTIC_FACE) { - if (!emit_vface_decl( emit )) + if (!emit_vface_decl(emit)) return FALSE; emit->emit_frontface = TRUE; emit->internal_frontface_idx = idx; @@ -260,34 +261,35 @@ ps30_input(struct svga_shader_emitter *emit, assert(semantic.Index == 0); - if (!ps30_input_emit_depth_fog( emit, &emit->input_map[idx] )) + if (!ps30_input_emit_depth_fog(emit, &emit->input_map[idx])) return FALSE; - emit->input_map[idx].base.swizzle = TRANSLATE_SWIZZLE( TGSI_SWIZZLE_X, + emit->input_map[idx].base.swizzle = TRANSLATE_SWIZZLE(TGSI_SWIZZLE_X, TGSI_SWIZZLE_X, TGSI_SWIZZLE_X, - TGSI_SWIZZLE_X ); - + TGSI_SWIZZLE_X); return TRUE; } else { - if (!translate_vs_ps_semantic( emit, semantic, &usage, &index )) + if (!translate_vs_ps_semantic(emit, semantic, &usage, &index)) return FALSE; if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX) return FALSE; - emit->input_map[idx] = src_register( SVGA3DREG_INPUT, emit->ps30_input_count++ ); - reg = dst( emit->input_map[idx] ); + emit->input_map[idx] = + src_register(SVGA3DREG_INPUT, emit->ps30_input_count++); + + reg = dst(emit->input_map[idx]); - if (!emit_decl( emit, reg, usage, index )) + if (!emit_decl(emit, reg, usage, index)) return FALSE; if (semantic.Name == TGSI_SEMANTIC_GENERIC && - emit->key.fkey.sprite_origin_lower_left && + emit->key.sprite_origin_lower_left && index >= 1 && - emit->key.fkey.tex[index - 1].sprite_texgen) { + emit->key.sprite_coord_enable & (1 << semantic.Index)) { /* This is a sprite texture coord with lower-left origin. * We need to invert the texture T coordinate since the SVGA3D * device only supports an upper-left origin. @@ -319,6 +321,7 @@ ps30_input(struct svga_shader_emitter *emit, /** * Process a PS output declaration. * Note that we don't actually emit a SVGA3DOpDcl for PS outputs. + * \idx register index, such as OUT[2] (not semantic index) */ static boolean ps30_output(struct svga_shader_emitter *emit, @@ -327,31 +330,52 @@ ps30_output(struct svga_shader_emitter *emit, { switch (semantic.Name) { case TGSI_SEMANTIC_COLOR: - if (emit->unit == PIPE_SHADER_FRAGMENT && - emit->key.fkey.white_fragments) { - - emit->output_map[idx] = dst_register( SVGA3DREG_TEMP, - emit->nr_hw_temp++ ); - emit->temp_col[idx] = emit->output_map[idx]; - emit->true_col[idx] = dst_register( SVGA3DREG_COLOROUT, - semantic.Index ); + if (emit->unit == PIPE_SHADER_FRAGMENT) { + if (emit->key.fs.white_fragments) { + /* Used for XOR logicop mode */ + emit->output_map[idx] = dst_register(SVGA3DREG_TEMP, + emit->nr_hw_temp++); + emit->temp_color_output[idx] = emit->output_map[idx]; + emit->true_color_output[idx] = dst_register(SVGA3DREG_COLOROUT, + semantic.Index); + } + else if (emit->key.fs.write_color0_to_n_cbufs) { + /* We'll write color output [0] to all render targets. + * Prepare all the output registers here, but only when the + * semantic.Index == 0 so we don't do this more than once. + */ + if (semantic.Index == 0) { + unsigned i; + for (i = 0; i < emit->key.fs.write_color0_to_n_cbufs; i++) { + emit->output_map[idx+i] = dst_register(SVGA3DREG_TEMP, + emit->nr_hw_temp++); + emit->temp_color_output[i] = emit->output_map[idx+i]; + emit->true_color_output[i] = dst_register(SVGA3DREG_COLOROUT, + i); + } + } + } + else { + emit->output_map[idx] = + dst_register(SVGA3DREG_COLOROUT, semantic.Index); + } } else { - emit->output_map[idx] = dst_register( SVGA3DREG_COLOROUT, - semantic.Index ); + emit->output_map[idx] = dst_register(SVGA3DREG_COLOROUT, + semantic.Index); } break; case TGSI_SEMANTIC_POSITION: - emit->output_map[idx] = dst_register( SVGA3DREG_TEMP, - emit->nr_hw_temp++ ); + emit->output_map[idx] = dst_register(SVGA3DREG_TEMP, + emit->nr_hw_temp++); emit->temp_pos = emit->output_map[idx]; - emit->true_pos = dst_register( SVGA3DREG_DEPTHOUT, - semantic.Index ); + emit->true_pos = dst_register(SVGA3DREG_DEPTHOUT, + semantic.Index); break; default: assert(0); /* A wild stab in the dark. */ - emit->output_map[idx] = dst_register( SVGA3DREG_COLOROUT, 0 ); + emit->output_map[idx] = dst_register(SVGA3DREG_COLOROUT, 0); break; } @@ -372,23 +396,23 @@ vs30_input(struct svga_shader_emitter *emit, SVGA3dShaderInstToken opcode; unsigned usage, index; - opcode = inst_token( SVGA3DOP_DCL ); + opcode = inst_token(SVGA3DOP_DCL); dcl.values[0] = 0; dcl.values[1] = 0; - emit->input_map[idx] = src_register( SVGA3DREG_INPUT, idx ); - dcl.dst = dst_register( SVGA3DREG_INPUT, idx ); + emit->input_map[idx] = src_register(SVGA3DREG_INPUT, idx); + dcl.dst = dst_register(SVGA3DREG_INPUT, idx); assert(dcl.dst.reserved0); - svga_generate_vdecl_semantics( idx, &usage, &index ); + svga_generate_vdecl_semantics(idx, &usage, &index); dcl.usage = usage; dcl.index = index; dcl.values[0] |= 1<<31; return (emit_instruction(emit, opcode) && - svga_shader_emit_dwords( emit, dcl.values, Elements(dcl.values))); + svga_shader_emit_dwords(emit, dcl.values, ARRAY_SIZE(dcl.values))); } @@ -406,13 +430,13 @@ vs30_output_emit_depth_fog(struct svga_shader_emitter *emit, return TRUE; } - reg = dst_register( SVGA3DREG_OUTPUT, emit->vs30_output_count++ ); + reg = dst_register(SVGA3DREG_OUTPUT, emit->vs30_output_count++); *out = emit->vs_depth_fog = reg; emit->emitted_depth_fog = TRUE; - return emit_decl( emit, reg, SVGA3D_DECLUSAGE_TEXCOORD, 0 ); + return emit_decl(emit, reg, SVGA3D_DECLUSAGE_TEXCOORD, 0); } @@ -430,42 +454,42 @@ vs30_output(struct svga_shader_emitter *emit, SVGA3dShaderInstToken opcode; unsigned usage, index; - opcode = inst_token( SVGA3DOP_DCL ); + opcode = inst_token(SVGA3DOP_DCL); dcl.values[0] = 0; dcl.values[1] = 0; - if (!translate_vs_ps_semantic( emit, semantic, &usage, &index )) + if (!translate_vs_ps_semantic(emit, semantic, &usage, &index)) return FALSE; if (emit->vs30_output_count >= SVGA3D_OUTPUTREG_MAX) return FALSE; - dcl.dst = dst_register( SVGA3DREG_OUTPUT, emit->vs30_output_count++ ); + dcl.dst = dst_register(SVGA3DREG_OUTPUT, emit->vs30_output_count++); dcl.usage = usage; dcl.index = index; dcl.values[0] |= 1<<31; if (semantic.Name == TGSI_SEMANTIC_POSITION) { assert(idx == 0); - emit->output_map[idx] = dst_register( SVGA3DREG_TEMP, - emit->nr_hw_temp++ ); + emit->output_map[idx] = dst_register(SVGA3DREG_TEMP, + emit->nr_hw_temp++); emit->temp_pos = emit->output_map[idx]; emit->true_pos = dcl.dst; /* Grab an extra output for the depth output */ - if (!vs30_output_emit_depth_fog( emit, &emit->depth_pos )) + if (!vs30_output_emit_depth_fog(emit, &emit->depth_pos)) return FALSE; } else if (semantic.Name == TGSI_SEMANTIC_PSIZE) { - emit->output_map[idx] = dst_register( SVGA3DREG_TEMP, - emit->nr_hw_temp++ ); + emit->output_map[idx] = dst_register(SVGA3DREG_TEMP, + emit->nr_hw_temp++); emit->temp_psiz = emit->output_map[idx]; - /* This has the effect of not declaring psiz (below) and not + /* This has the effect of not declaring psiz (below) and not * emitting the final MOV to true_psiz in the postamble. */ - if (!emit->key.vkey.allow_psiz) + if (!emit->key.vs.allow_psiz) return TRUE; emit->true_psiz = dcl.dst; @@ -477,7 +501,7 @@ vs30_output(struct svga_shader_emitter *emit, */ emit->vs30_output_count--; - if (!vs30_output_emit_depth_fog( emit, &emit->output_map[idx] )) + if (!vs30_output_emit_depth_fog(emit, &emit->output_map[idx])) return FALSE; return TRUE; @@ -487,7 +511,7 @@ vs30_output(struct svga_shader_emitter *emit, } return (emit_instruction(emit, opcode) && - svga_shader_emit_dwords( emit, dcl.values, Elements(dcl.values))); + svga_shader_emit_dwords(emit, dcl.values, ARRAY_SIZE(dcl.values))); } @@ -495,15 +519,17 @@ vs30_output(struct svga_shader_emitter *emit, static ubyte svga_tgsi_sampler_type(const struct svga_shader_emitter *emit, int idx) { - switch (emit->key.fkey.tex[idx].texture_target) { - case PIPE_TEXTURE_1D: + switch (emit->sampler_target[idx]) { + case TGSI_TEXTURE_1D: return SVGA3DSAMP_2D; - case PIPE_TEXTURE_2D: - case PIPE_TEXTURE_RECT: + case TGSI_TEXTURE_2D: + case TGSI_TEXTURE_RECT: return SVGA3DSAMP_2D; - case PIPE_TEXTURE_3D: + case TGSI_TEXTURE_SHADOW2D: + return SVGA3DSAMP_2D_SHADOW; + case TGSI_TEXTURE_3D: return SVGA3DSAMP_VOLUME; - case PIPE_TEXTURE_CUBE: + case TGSI_TEXTURE_CUBE: return SVGA3DSAMP_CUBE; } @@ -512,55 +538,78 @@ svga_tgsi_sampler_type(const struct svga_shader_emitter *emit, int idx) static boolean -ps30_sampler( struct svga_shader_emitter *emit, - struct tgsi_declaration_semantic semantic, - unsigned idx ) +ps30_sampler(struct svga_shader_emitter *emit, + unsigned idx) { SVGA3DOpDclArgs dcl; SVGA3dShaderInstToken opcode; - opcode = inst_token( SVGA3DOP_DCL ); + opcode = inst_token(SVGA3DOP_DCL); dcl.values[0] = 0; dcl.values[1] = 0; - dcl.dst = dst_register( SVGA3DREG_SAMPLER, idx ); - dcl.type = svga_tgsi_sampler_type( emit, idx ); + dcl.dst = dst_register(SVGA3DREG_SAMPLER, idx); + dcl.type = svga_tgsi_sampler_type(emit, idx); dcl.values[0] |= 1<<31; return (emit_instruction(emit, opcode) && - svga_shader_emit_dwords( emit, dcl.values, Elements(dcl.values))); + svga_shader_emit_dwords(emit, dcl.values, ARRAY_SIZE(dcl.values))); +} + + +boolean +svga_shader_emit_samplers_decl(struct svga_shader_emitter *emit) +{ + unsigned i; + + for (i = 0; i < emit->num_samplers; i++) { + if (!ps30_sampler(emit, i)) + return FALSE; + } + return TRUE; } boolean -svga_translate_decl_sm30( struct svga_shader_emitter *emit, - const struct tgsi_full_declaration *decl ) +svga_translate_decl_sm30(struct svga_shader_emitter *emit, + const struct tgsi_full_declaration *decl) { unsigned first = decl->Range.First; unsigned last = decl->Range.Last; unsigned idx; - for( idx = first; idx <= last; idx++ ) { - boolean ok; + for (idx = first; idx <= last; idx++) { + boolean ok = TRUE; switch (decl->Declaration.File) { case TGSI_FILE_SAMPLER: assert (emit->unit == PIPE_SHADER_FRAGMENT); - ok = ps30_sampler( emit, decl->Semantic, idx ); + /* just keep track of the number of samplers here. + * Will emit the declaration in the helpers function. + */ + emit->num_samplers = MAX2(emit->num_samplers, decl->Range.Last + 1); break; case TGSI_FILE_INPUT: if (emit->unit == PIPE_SHADER_VERTEX) - ok = vs30_input( emit, decl->Semantic, idx ); + ok = vs30_input(emit, decl->Semantic, idx); else - ok = ps30_input( emit, decl->Semantic, idx ); + ok = ps30_input(emit, decl->Semantic, idx); break; case TGSI_FILE_OUTPUT: if (emit->unit == PIPE_SHADER_VERTEX) - ok = vs30_output( emit, decl->Semantic, idx ); + ok = vs30_output(emit, decl->Semantic, idx); else - ok = ps30_output( emit, decl->Semantic, idx ); + ok = ps30_output(emit, decl->Semantic, idx); + break; + + case TGSI_FILE_SAMPLER_VIEW: + { + unsigned unit = decl->Range.First; + assert(decl->Range.First == decl->Range.Last); + emit->sampler_target[unit] = decl->SamplerView.Resource; + } break; default: