meta/sso: Update meta to save and restore SSO state.
save and restore _Shader/Pipeline binding point. Rational we don't want any conflict when the program will be unattached. V2: formatting improvement V3 (idr): * Build fix. The original patch added calls to _mesa_use_shader_program with 4 parameters, but the fourth parameter isn't added to that function until a much later patch. Just drop that parameter for now. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
committed by
Ian Romanick
parent
c03477050a
commit
de4f85f52d
@@ -53,6 +53,7 @@
|
||||
#include "main/mipmap.h"
|
||||
#include "main/multisample.h"
|
||||
#include "main/objectlabel.h"
|
||||
#include "main/pipelineobj.h"
|
||||
#include "main/pixel.h"
|
||||
#include "main/pbo.h"
|
||||
#include "main/polygon.h"
|
||||
@@ -535,6 +536,14 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
|
||||
_mesa_set_enable(ctx, GL_FRAGMENT_SHADER_ATI, GL_FALSE);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
for (i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
_mesa_reference_shader_program(ctx, &save->Shader[i],
|
||||
ctx->_Shader->CurrentProgram[i]);
|
||||
@@ -880,6 +889,14 @@ _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]);
|
||||
@@ -899,6 +916,7 @@ _mesa_meta_end(struct gl_context *ctx)
|
||||
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) {
|
||||
|
||||
@@ -121,6 +121,8 @@ 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 */
|
||||
struct gl_stencil_attrib Stencil;
|
||||
|
||||
Reference in New Issue
Block a user