[Mesa-dev] [PATCH 05/21] meta: Fix saving the program pipeline state
Chia-I Wu
olvaffe at gmail.com
Wed Apr 30 18:59:14 PDT 2014
On Thu, May 1, 2014 at 12:11 AM, Ian Romanick <idr at freedesktop.org> wrote:
> 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.
The patch should not affect the result, but I got this error after applying it
$ ./bin/arb_separate_shader_object-rendezvous_by_location -auto
Probe color at (0,0)
Expected: 0.000000 1.000000 0.000000 1.000000
Observed: 1.000000 1.000000 1.000000 1.000000
PIGLIT: {'result': 'fail' }
I am also on sso6 (except that I merged it to master).
>
>>> +
>>> + _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
>
--
olv at LunarG.com
More information about the mesa-dev
mailing list