On Sun, Sep 21, 2014 at 3:41 AM, Chris Forbes <chr...@ijw.co.nz> wrote: > If the hardware needs to always have a control shader present if > and evaluation shader is present, then the control shader will need > these values. > --- > src/glsl/builtin_variables.cpp | 14 ++++++++++++++ > src/mesa/program/prog_statevars.c | 24 ++++++++++++++++++++++++ > src/mesa/program/prog_statevars.h | 3 +++ > 3 files changed, 41 insertions(+) > > diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp > index 97ef68c..0909818 100644 > --- a/src/glsl/builtin_variables.cpp > +++ b/src/glsl/builtin_variables.cpp > @@ -33,6 +33,14 @@ static const struct gl_builtin_uniform_element > gl_NumSamples_elements[] = { > {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX} > }; > > +static const struct gl_builtin_uniform_element > gl_DefaultTessLevelOuterMESA_elements[] = { > + {NULL, {STATE_INTERNAL, STATE_DEFAULT_TESS_LEVEL_OUTER, 0, 0}, > SWIZZLE_XXXX} > +}; > + > +static const struct gl_builtin_uniform_element > gl_DefaultTessLevelInnerMESA_elements[] = { > + {NULL, {STATE_INTERNAL, STATE_DEFAULT_TESS_LEVEL_INNER, 0, 0}, > SWIZZLE_XXXX} > +}; > + > static const struct gl_builtin_uniform_element gl_DepthRange_elements[] = { > {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX}, > {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY}, > @@ -280,6 +288,9 @@ static const struct gl_builtin_uniform_desc > _mesa_builtin_uniform_desc[] = { > STATEVAR(gl_CurrentAttribVertMESA), > STATEVAR(gl_CurrentAttribFragMESA), > > + STATEVAR(gl_DefaultTessLevelOuterMESA), > + STATEVAR(gl_DefaultTessLevelInnerMESA), > + > {NULL, NULL, 0} > }; > > @@ -743,6 +754,9 @@ builtin_variable_generator::generate_uniforms() > add_uniform(array(vec4_t, VERT_ATTRIB_MAX), "gl_CurrentAttribVertMESA"); > add_uniform(array(vec4_t, VARYING_SLOT_MAX), "gl_CurrentAttribFragMESA"); > > + add_uniform(array(float_t, 4), "gl_DefaultTessLevelOuterMESA"); > + add_uniform(array(float_t, 2), "gl_DefaultTessLevelInnerMESA"); > + > if (compatibility) { > add_uniform(mat4_t, "gl_ModelViewMatrix"); > add_uniform(mat4_t, "gl_ProjectionMatrix"); > diff --git a/src/mesa/program/prog_statevars.c > b/src/mesa/program/prog_statevars.c > index be5ddb1..785257b 100644 > --- a/src/mesa/program/prog_statevars.c > +++ b/src/mesa/program/prog_statevars.c > @@ -593,6 +593,20 @@ _mesa_fetch_state(struct gl_context *ctx, const > gl_state_index state[], > } > return; > > + case STATE_DEFAULT_TESS_LEVEL_OUTER: > + value[0] = ctx->TessCtrlProgram.patch_default_outer_level[state[2]]; > + value[1] = 0.0F; > + value[2] = 0.0F; > + value[3] = 0.0F;
Having a single vec4 for patch_default_outer_level would be nicer. This adds 4 vec4s to the default constant buffer, which is not nice, but it's not a big deal. > + return; > + > + case STATE_DEFAULT_TESS_LEVEL_INNER: > + value[0] = ctx->TessCtrlProgram.patch_default_inner_level[state[2]]; > + value[1] = 0.0F; > + value[2] = 0.0F; > + value[3] = 0.0F; > + return; Same as above. We need only vec4.xy for this one. > + > /* XXX: make sure new tokens added here are also handled in the > * _mesa_program_state_flags() switch, below. > */ > @@ -703,6 +717,10 @@ _mesa_program_state_flags(const gl_state_index > state[STATE_LENGTH]) > case STATE_FB_WPOS_Y_TRANSFORM: > return _NEW_BUFFERS; > > + case STATE_DEFAULT_TESS_LEVEL_OUTER: > + case STATE_DEFAULT_TESS_LEVEL_INNER: > + return _NEW_PROGRAM; This won't catch state changes made by glPatchParameterfv. glPatchParameterfv should add a flag and also call FLUSH_VERTICES and the same flag should be used for these 2 state variables. Otherwise, the constant buffer won't be updated after glPatchParameterfv is called. Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev