[Mesa-dev] [PATCH 05/21] meta: Fix saving the program pipeline state
Ian Romanick
idr at freedesktop.org
Wed Apr 30 09:11:05 PDT 2014
On 04/29/2014 08:43 PM, Chia-I Wu wrote:
> On Wed, Apr 30, 2014 at 8:52 AM, Ian Romanick <idr at freedesktop.org> wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> This code was broken in some odd ways before. Too much state was being
>> saved, it was being restored in the wrong order, and in the wrong way.
>> The biggest problem was that the pipeline object was restored before
>> restoring the programs attached to the default pipeline.
>>
>> Fixes a regression in the glean texgen test.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
>> Reviewed-by: Eric Anholt <eric at anholt.net>
>> ---
>> src/mesa/drivers/common/meta.c | 34 ++++++++++++++++++++--------------
>> src/mesa/drivers/common/meta.h | 1 -
>> 2 files changed, 20 insertions(+), 15 deletions(-)
>>
>> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
>> index ac27abb..92bc185 100644
>> --- a/src/mesa/drivers/common/meta.c
>> +++ b/src/mesa/drivers/common/meta.c
>> @@ -577,11 +577,15 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
>> }
>>
>> if (ctx->Extensions.ARB_separate_shader_objects) {
>> - /* Warning it must be done before _mesa_UseProgram call */
>> - _mesa_reference_pipeline_object(ctx, &save->_Shader, ctx->_Shader);
>> - _mesa_reference_pipeline_object(ctx, &save->Pipeline,
>> - ctx->Pipeline.Current);
>> - _mesa_BindProgramPipeline(0);
>> + /* Warning: This must be done before saving the current programs.
>> + * Otherwise the programs attached to the pipeline will be saved
>> + * instead of the programs attached to the default pipeline.
>> + */
>> + if (ctx->Pipeline.Current != ctx->Pipeline.Default) {
>> + _mesa_reference_pipeline_object(ctx, &save->Pipeline,
>> + ctx->Pipeline.Current);
>> + _mesa_BindProgramPipeline(0);
>> + }
>> }
>>
>> for (i = 0; i < MESA_SHADER_STAGES; i++) {
>> @@ -929,14 +933,6 @@ _mesa_meta_end(struct gl_context *ctx)
>> save->ATIFragmentShaderEnabled);
>> }
>>
>> - /* Warning it must be done before _mesa_use_shader_program call */
>> - if (ctx->Extensions.ARB_separate_shader_objects) {
>> - _mesa_reference_pipeline_object(ctx, &ctx->_Shader, save->_Shader);
>> - _mesa_reference_pipeline_object(ctx, &ctx->Pipeline.Current,
>> - save->Pipeline);
>> - _mesa_reference_pipeline_object(ctx, &save->Pipeline, NULL);
>> - }
>> -
>> if (ctx->Extensions.ARB_vertex_shader) {
>> _mesa_use_shader_program(ctx, GL_VERTEX_SHADER,
>> save->Shader[MESA_SHADER_VERTEX],
>> @@ -956,10 +952,20 @@ _mesa_meta_end(struct gl_context *ctx)
>> _mesa_reference_shader_program(ctx, &ctx->_Shader->ActiveProgram,
>> save->ActiveShader);
>>
>> + /* Warning: This must be done after _mesa_use_shader_program call.
>> + * Otherwise the programs will be restored to the pipeline object
>> + * instead of to the default pipeline.
>> + */
>> + if (save->Pipeline) {
>> + assert(ctx->Extensions.ARB_separate_shader_objects);
>> + _mesa_bind_pipeline(ctx, save->Pipeline);
> This issue does not appear to be fixed
>
> http://lists.freedesktop.org/archives/mesa-dev/2014-April/057999.html
>
> The attached change to piglit triggers it.
What should the result have been with that patch? I tried that with my
current sso6 branch, and
arb_separate_shader_objects-rendezvous_by_location passes with or
without this patch.
>> +
>> + _mesa_reference_pipeline_object(ctx, &save->Pipeline, NULL);
>> + }
>> +
>> for (i = 0; i < MESA_SHADER_STAGES; i++)
>> _mesa_reference_shader_program(ctx, &save->Shader[i], NULL);
>> _mesa_reference_shader_program(ctx, &save->ActiveShader, NULL);
>> - _mesa_reference_pipeline_object(ctx, &save->_Shader, NULL);
>> }
>>
>> if (state & MESA_META_STENCIL_TEST) {
>> diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
>> index fde4f9a..0a34792 100644
>> --- a/src/mesa/drivers/common/meta.h
>> +++ b/src/mesa/drivers/common/meta.h
>> @@ -121,7 +121,6 @@ struct save_state
>> GLboolean ATIFragmentShaderEnabled;
>> struct gl_shader_program *Shader[MESA_SHADER_STAGES];
>> struct gl_shader_program *ActiveShader;
>> - struct gl_pipeline_object *_Shader;
>> struct gl_pipeline_object *Pipeline;
>>
>> /** MESA_META_STENCIL_TEST */
>> --
>> 1.8.1.4
>>
>> _______________________________________________
>> 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