[Mesa-dev] [PATCH 2/3] mesa: build up a mask of active shader stages in a pipeline
Tapani Pälli
tapani.palli at intel.com
Mon Dec 7 21:15:39 PST 2015
On 12/08/2015 06:21 AM, Timothy Arceri wrote:
> On Tue, 2015-12-08 at 10:55 +1100, Timothy Arceri wrote:
>> On Mon, 2015-12-07 at 11:29 +0200, Tapani Pälli wrote:
>>> This will be used for validating SSO pipeline where all active
>>> stages
>>> in linked programs should be in use when rendering.
>>>
>>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>>> ---
>>> src/mesa/main/mtypes.h | 2 ++
>>> src/mesa/main/pipelineobj.c | 39
>>> +++++++++++++++++++++++++++++++++++++++
>>> 2 files changed, 41 insertions(+)
>>>
>>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>>> index fa7ead0..d5a22c9 100644
>>> --- a/src/mesa/main/mtypes.h
>>> +++ b/src/mesa/main/mtypes.h
>>> @@ -2824,6 +2824,8 @@ struct gl_pipeline_object
>>> GLboolean Validated; /**< Pipeline Validation
>>> status */
>>>
>>> GLchar *InfoLog;
>>> +
>>> + uint8_t ActiveStages; /**< Stages used,
>>> (glUseProgramStages) */
>>> };
>>>
>>> /**
>>> diff --git a/src/mesa/main/pipelineobj.c
>>> b/src/mesa/main/pipelineobj.c
>>> index 6710d0d..c510ee8 100644
>>> --- a/src/mesa/main/pipelineobj.c
>>> +++ b/src/mesa/main/pipelineobj.c
>>> @@ -218,6 +218,43 @@ _mesa_reference_pipeline_object_(struct
>>> gl_context *ctx,
>>> }
>>> }
>>>
>>> +static GLenum
>>> +shader_bit_from_shader_stage(gl_shader_stage stage)
>>> +{
>>> + switch (stage) {
>>> + case MESA_SHADER_VERTEX:
>>> + return GL_VERTEX_SHADER_BIT;
>>> + case MESA_SHADER_FRAGMENT:
>>> + return GL_FRAGMENT_SHADER_BIT;
>>> + case MESA_SHADER_GEOMETRY:
>>> + return GL_GEOMETRY_SHADER_BIT;
>>> + case MESA_SHADER_TESS_CTRL:
>>> + return GL_TESS_CONTROL_SHADER_BIT;
>>> + case MESA_SHADER_TESS_EVAL:
>>> + return GL_TESS_EVALUATION_SHADER_BIT;
>>> + case MESA_SHADER_COMPUTE:
>>> + return GL_COMPUTE_SHADER_BIT;
>>> + default:
>>> + unreachable("bad value in
>>> _mesa_shader_bit_from_shader_stage()");
>>> + }
>>> +}
>>> +
>>> +static void
>>> +update_active_pipeline_stages(struct gl_pipeline_object *pipe,
>>> + struct gl_shader_program *shProg,
>>> + GLbitfield stages)
>>> +{
>>> + unsigned i;
>>> + for (i = 0; i < MESA_SHADER_STAGES; i++) {
>>> + if ((stages & shader_bit_from_shader_stage(i)) != 0) {
>>> + if (shProg && shProg->ActiveStages & (1 << i))
>>> + pipe->ActiveStages |= (1 << i);
>>> + else
>>> + pipe->ActiveStages &= ~(1 << i);
>>> + }
>>> + }
>> I think you could do most of the validation at this point which would
>> reduce the amount of work required during rendering. You also have
>> forgotten about GL_ALL_SHADER_BITS.
> No you didn't I was just looking at to code for to long :P However
> unless I'm missing something I believe my other comments are still
> valid.
OK, I'll try "moving the validation" here, it would be nice. I wanted to
avoid nested loops like below by using masks but I guess for
UseProgramStages it should not be that big problem.
>> For example could you do something like this?
>>
>> Note: You would need to call this function after the
>> _mesa_use_shader_program() calls.
>>
>> unsigned i;
>> unsigned j;
>>
>> for (i = 0; i < MESA_SHADER_STAGES; i++) {
>> if (!pipe->CurrentProgram[i]) {
>> struct gl_shader_program *shProg = pipe->CurrentProgram[i];
>> for (j = 0; j < MESA_SHADER_STAGES; j++) {
>> if (!shProg->_LinkedShaders[j])
>> continue;
>>
>> /* Make sure that any shader stage is also used in the
>> pipeline */
>> if (shProg != pipe->CurrentProgram[j]) {
>> pipe->ValidProgramUse = false;
>> return;
>> }
>> }
>> }
>>
>> pipe->ValidProgramUse = true;
>> }
>>
>>> +}
>>> +
>>> /**
>>> * Bound program to severals stages of the pipeline
>>> */
>>> @@ -311,6 +348,8 @@ _mesa_UseProgramStages(GLuint pipeline,
>>> GLbitfield stages, GLuint program)
>>> }
>>> }
>>>
>>> + update_active_pipeline_stages(pipe, shProg, stages);
>>> +
>>> /* Enable individual stages from the program as requested by
>>> the
>>> * application. If there is no shader for a requested stage in
>>> the
>>> * program, _mesa_use_shader_program will enable fixed-function
>>> processing
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list