[Mesa-dev] [PATCH 2/7] st/mesa: implement GL_ATI_fragment_shader
Miklós Máté
mtmkls at gmail.com
Thu Feb 25 15:18:43 UTC 2016
On 02/25/2016 11:40 AM, Marek Olšák wrote:
> On Thu, Feb 25, 2016 at 12:35 AM, Miklós Máté <mtmkls at gmail.com> wrote:
>> v2: fix arithmetic for special opcodes,
>> fix fog state, cleanup
>> v3: simplify handling of special opcodes,
>> fix rebinding with different textargets or fog equation,
>> lots of formatting fixes
>>
>> Signed-off-by: Miklós Máté <mtmkls at gmail.com>
>> ---
>> src/mesa/Makefile.sources | 1 +
>> src/mesa/main/atifragshader.h | 1 +
>> src/mesa/main/texstate.c | 18 +
>> src/mesa/main/texstate.h | 3 +
>> src/mesa/program/program.h | 2 +
>> src/mesa/state_tracker/st_atifs_to_tgsi.c | 726 ++++++++++++++++++++++++++++++
>> src/mesa/state_tracker/st_atifs_to_tgsi.h | 65 +++
>> src/mesa/state_tracker/st_atom_constbuf.c | 16 +
>> src/mesa/state_tracker/st_atom_shader.c | 27 +-
>> src/mesa/state_tracker/st_cb_drawpixels.c | 1 +
>> src/mesa/state_tracker/st_cb_program.c | 36 +-
>> src/mesa/state_tracker/st_program.c | 30 +-
>> src/mesa/state_tracker/st_program.h | 7 +
>> 13 files changed, 930 insertions(+), 3 deletions(-)
>> create mode 100644 src/mesa/state_tracker/st_atifs_to_tgsi.c
>> create mode 100644 src/mesa/state_tracker/st_atifs_to_tgsi.h
[snip]
>> + if (texinst->Opcode == ATI_FRAGMENT_SHADER_SAMPLE_OP) {
>> + /* use the current texture target for the sample operation
>> + * note: this implementation doesn't support re-using an ATI_fs
>> + * with different texture targets
>> + */
>> + gl_texture_index index = _mesa_get_texture_target_index(t->ctx, r);
> Please use value from the shader key here, not the context function.
>
>> + unsigned target = translate_texture_target(index);
>> +
>> + /* by default texture and sampler indexes are the same */
>> + src[1] = t->samplers[r];
>> + ureg_tex_insn(t->ureg, TGSI_OPCODE_TEX, dst, 1, target,
>> + NULL, 0, src, 2);
>> + } else if (texinst->Opcode == ATI_FRAGMENT_SHADER_PASS_OP) {
>> + ureg_insn(t->ureg, TGSI_OPCODE_MOV, dst, 1, src, 1);
>> + }
>> +
[snip]
>> +/**
>> + * Called when a new variant is needed, we need to translate
>> + * the ATI fragment shader to TGSI
>> + */
>> +enum pipe_error
>> +st_translate_atifs_program(
>> + struct gl_context *ctx,
>> + struct ureg_program *ureg,
>> + struct ati_fragment_shader *atifs,
>> + struct gl_program *program,
>> + GLuint numInputs,
>> + const GLuint inputMapping[],
>> + const ubyte inputSemanticName[],
>> + const ubyte inputSemanticIndex[],
>> + const GLuint interpMode[],
>> + GLuint numOutputs,
>> + const GLuint outputMapping[],
>> + const ubyte outputSemanticName[],
>> + const ubyte outputSemanticIndex[])
>> +{
>> + enum pipe_error ret = PIPE_OK;
>> +
>> + unsigned pass, i, r;
>> +
>> + struct st_translate translate, *t;
>> + t = &translate;
>> + memset(t, 0, sizeof *t);
>> +
>> + t->inputMapping = inputMapping;
>> + t->outputMapping = outputMapping;
>> + t->ureg = ureg;
>> + t->ctx = ctx;
>> + t->atifs = atifs;
>> +
>> + /*
>> + * Declare input attributes.
>> + */
>> + for (i = 0; i < numInputs; i++) {
>> + t->inputs[i] = ureg_DECL_fs_input(ureg,
>> + inputSemanticName[i],
>> + inputSemanticIndex[i],
>> + interpMode[i]);
>> + }
>> +
>> + /*
>> + * Declare output attributes:
>> + * we always have numOutputs=1 and it's FRAG_RESULT_COLOR
>> + */
>> + t->outputs[0] = ureg_DECL_output( ureg,
>> + TGSI_SEMANTIC_COLOR,
>> + outputSemanticIndex[0] );
>> +
>> + /* Emit constants and immediates. Mesa uses a single index space
>> + * for these, so we put all the translated regs in t->constants.
>> + */
>> + if (program->Parameters) {
>> + t->constants = calloc( program->Parameters->NumParameters,
>> + sizeof t->constants[0] );
>> + if (t->constants == NULL) {
>> + ret = PIPE_ERROR_OUT_OF_MEMORY;
>> + goto out;
>> + }
>> +
>> + for (i = 0; i < program->Parameters->NumParameters; i++) {
>> + switch (program->Parameters->Parameters[i].Type) {
>> + case PROGRAM_STATE_VAR:
>> + case PROGRAM_UNIFORM:
>> + t->constants[i] = ureg_DECL_constant( ureg, i );
>> + break;
>> +
>> + case PROGRAM_CONSTANT:
>> + t->constants[i] =
>> + ureg_DECL_immediate( ureg,
>> + (const float*)program->Parameters->ParameterValues[i],
>> + 4 );
>> + break;
>> + default:
>> + break;
>> + }
>> + }
>> + }
>> +
>> + /* texture samplers */
>> + for (i = 0; i < ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; i++) {
>> + if (program->SamplersUsed & (1 << i)) {
>> + t->samplers[i] = ureg_DECL_sampler( ureg, i );
>> +
>> + /* fix texture targets that are not 2D * /
>> + / * note: this implementation doesn't support re-using an ATI_fs
>> + * with different texture targets
>> + */
>> + gl_texture_index index = _mesa_get_texture_target_index(ctx, i);
> Same here - please use the shader key. Also, the comment above that
> looks obsolete now.
>
> Marek
I'd love to, but this is called from st_translate_fragment_program(),
which doesn't have the key.
Moreover, st_translate_fragment_program() is usually called from
st_program_string_notify(), where
there is no shader key at all.
The comment is indeed obsolete now, I now removed it.
MM
More information about the mesa-dev
mailing list