On 23.05.2018 22:58, Marek Olšák wrote:
From: Marek Olšák <[email protected]>

---
  src/mesa/main/state.c | 64 ++++++++++++++++++++++++-------------------
  1 file changed, 36 insertions(+), 28 deletions(-)

diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index be8f3f302c6..097cd9e20d2 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -215,55 +215,63 @@ update_program(struct gl_context *ctx)
         ctx->GeometryProgram._Current != prevGP ||
         ctx->TessEvalProgram._Current != prevTEP ||
         ctx->TessCtrlProgram._Current != prevTCP ||
         ctx->ComputeProgram._Current != prevCP)
        return _NEW_PROGRAM;
return 0;
  }
-/**
- * Examine shader constants and return either _NEW_PROGRAM_CONSTANTS or 0.
- */
  static GLbitfield
-update_program_constants(struct gl_context *ctx)
+update_single_program_constants(struct gl_context *ctx,
+                                struct gl_program *prog,
+                                gl_shader_stage stage)
  {
-   GLbitfield new_state = 0x0;
-
-   if (ctx->FragmentProgram._Current) {
-      const struct gl_program_parameter_list *params =
-         ctx->FragmentProgram._Current->Parameters;
+   if (prog) {

It may be slightly better to put this check into the caller to avoid the function call overhead. But admittedly that's just a hunch, and it's your call.

Apart from that, patches 1-3:

Reviewed-by: Nicolai Hähnle <[email protected]>


+      const struct gl_program_parameter_list *params = prog->Parameters;
        if (params && params->StateFlags & ctx->NewState) {
-         if (ctx->DriverFlags.NewShaderConstants[MESA_SHADER_FRAGMENT]) {
-            ctx->NewDriverState |=
-               ctx->DriverFlags.NewShaderConstants[MESA_SHADER_FRAGMENT];
-         } else {
-            new_state |= _NEW_PROGRAM_CONSTANTS;
-         }
+         if (ctx->DriverFlags.NewShaderConstants[stage])
+            ctx->NewDriverState |= ctx->DriverFlags.NewShaderConstants[stage];
+         else
+            return _NEW_PROGRAM_CONSTANTS;
        }
     }
+   return 0;
+}
- /* Don't handle tessellation and geometry shaders here. They don't use
-    * any state constants.
-    */
- if (ctx->VertexProgram._Current) {
-      const struct gl_program_parameter_list *params =
-         ctx->VertexProgram._Current->Parameters;
-      if (params && params->StateFlags & ctx->NewState) {
-         if (ctx->DriverFlags.NewShaderConstants[MESA_SHADER_VERTEX]) {
-            ctx->NewDriverState |=
-               ctx->DriverFlags.NewShaderConstants[MESA_SHADER_VERTEX];
-         } else {
-            new_state |= _NEW_PROGRAM_CONSTANTS;
-         }
+/**
+ * This updates fixed-func state constants such as gl_ModelViewMatrix.
+ * Examine shader constants and return either _NEW_PROGRAM_CONSTANTS or 0.
+ */
+static GLbitfield
+update_program_constants(struct gl_context *ctx)
+{
+   GLbitfield new_state =
+      update_single_program_constants(ctx, ctx->VertexProgram._Current,
+                                      MESA_SHADER_VERTEX) |
+      update_single_program_constants(ctx, ctx->FragmentProgram._Current,
+                                      MESA_SHADER_FRAGMENT);
+
+   if (ctx->API == API_OPENGL_COMPAT &&
+       ctx->Const.GLSLVersionCompat >= 150) {
+      new_state |=
+         update_single_program_constants(ctx, ctx->GeometryProgram._Current,
+                                         MESA_SHADER_GEOMETRY);
+
+      if (_mesa_has_ARB_tessellation_shader(ctx)) {
+         new_state |=
+            update_single_program_constants(ctx, ctx->TessCtrlProgram._Current,
+                                            MESA_SHADER_TESS_CTRL) |
+            update_single_program_constants(ctx, ctx->TessEvalProgram._Current,
+                                            MESA_SHADER_TESS_EVAL);
        }
     }
return new_state;
  }
/**
   * Compute derived GL state.
   * If __struct gl_contextRec::NewState is non-zero then this function \b must



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to