On 02/25/2016 07:38 PM, Ian Romanick wrote:
On 02/24/2016 05:37 PM, Brian Paul wrote:
On 02/24/2016 04:35 PM, Miklós Máté wrote:
the state tracker will use it

Signed-off-by: Miklós Máté <mtm...@gmail.com>
---
   src/mesa/drivers/common/driverfuncs.c |  3 +++
   src/mesa/main/atifragshader.c         | 13 ++++++++++++-
   src/mesa/main/dd.h                    |  7 ++++++-
   src/mesa/main/mtypes.h                |  1 +
   src/mesa/main/state.c                 | 14 +++++++++++++-
   5 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/common/driverfuncs.c
b/src/mesa/drivers/common/driverfuncs.c
index 752aaf6..65a0cf8 100644
--- a/src/mesa/drivers/common/driverfuncs.c
+++ b/src/mesa/drivers/common/driverfuncs.c
@@ -117,6 +117,9 @@ _mesa_init_driver_functions(struct
dd_function_table *driver)
      driver->NewProgram = _mesa_new_program;
      driver->DeleteProgram = _mesa_delete_program;

+   /* ATI_fragment_shader */
+   driver->NewATIfs = NULL;
+
      /* simple state commands */
      driver->AlphaFunc = NULL;
      driver->BlendColor = NULL;
diff --git a/src/mesa/main/atifragshader.c
b/src/mesa/main/atifragshader.c
index 8fcbff6..34f45c6 100644
--- a/src/mesa/main/atifragshader.c
+++ b/src/mesa/main/atifragshader.c
@@ -30,6 +30,7 @@
   #include "main/mtypes.h"
   #include "main/dispatch.h"
   #include "main/atifragshader.h"
+#include "program/program.h"

   #define MESA_DEBUG_ATI_FS 0

@@ -63,6 +64,7 @@ _mesa_delete_ati_fragment_shader(struct gl_context
*ctx, struct ati_fragment_sha
         free(s->Instructions[i]);
         free(s->SetupInst[i]);
      }
+   _mesa_reference_program(ctx, &s->Program, NULL);
      free(s);
   }

@@ -321,6 +323,8 @@ _mesa_BeginFragmentShaderATI(void)
            free(ctx->ATIFragmentShader.Current->SetupInst[i]);
      }

+   _mesa_reference_program(ctx,
&ctx->ATIFragmentShader.Current->Program, NULL);
+
      /* malloc the instructions here - not sure if the best place but its
         a start */
      for (i = 0; i < MAX_NUM_PASSES_ATI; i++) {
@@ -405,7 +409,14 @@ _mesa_EndFragmentShaderATI(void)
      }
   #endif

-   if (!ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_SHADER_ATI,
NULL)) {
+   if (ctx->Driver.NewATIfs) {
+      struct gl_program *prog = ctx->Driver.NewATIfs(ctx,
+
ctx->ATIFragmentShader.Current);
+      _mesa_reference_program(ctx,
&ctx->ATIFragmentShader.Current->Program, prog);
+   }
+
+   if (!ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_SHADER_ATI,
+                                        curProg->Program)) {
         ctx->ATIFragmentShader.Current->isValid = GL_FALSE;
         /* XXX is this the right error? */
         _mesa_error(ctx, GL_INVALID_OPERATION,
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 3f5aa5d..8410a15 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -473,7 +473,12 @@ struct dd_function_table {
      struct gl_program * (*NewProgram)(struct gl_context *ctx, GLenum
target,
                                        GLuint id);
      /** Delete a program */
-   void (*DeleteProgram)(struct gl_context *ctx, struct gl_program
*prog);
+   void (*DeleteProgram)(struct gl_context *ctx, struct gl_program
*prog);
+   /**
+    * Allocate a program to associate with the new ATI fragment
shader (optional)
+    */
+   struct gl_program * (*NewATIfs)(struct gl_context *ctx,
+         struct ati_fragment_shader *curProg);
The second line of the function decl should be indented more.  See other
nearby functions for examples.
Also... what changed in the DeleteProgram line?  I've been staring at
it, but I can't see the sailboat.
I accidentally included the removal of the trailing whitespace. My editor automatically removes them, so I have to pick changes line-by-line.


Patch looks OK otherwise.

Acked-by: Brian Paul <bri...@vmware.com>
With the various whitespace issues fixed (and I think the DeleteProgram
change is a whitespace issue of some sort), this patch is

Reviewed-by: Ian Romanick <ian.d.roman...@intel.com>

Miklós, I assume you need someone to commit this for you?  I can fix the
minor whitespace problems and commit it.
Yes, thank you. I thought I got rid of all formatting issues since the last time, but it seems some of them eluded my attention.

MM


      /**
       * Notify driver that a program string (and GPU code) has been
specified
       * or modified.  Return GL_TRUE or GL_FALSE to indicate if the
program is
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 12d3863..22e8a21 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2197,6 +2197,7 @@ struct ati_fragment_shader
      GLboolean interpinp1;
      GLboolean isValid;
      GLuint swizzlerq;
+   struct gl_program *Program;
   };

   /**
diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index 57f1341..f4e8288 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -124,7 +124,8 @@ update_program(struct gl_context *ctx)
       * follows:
       *   1. OpenGL 2.0/ARB vertex/fragment shaders
       *   2. ARB/NV vertex/fragment programs
-    *   3. Programs derived from fixed-function state.
+    *   3. ATI fragment shader
+    *   4. Programs derived from fixed-function state.
       *
       * Note: it's possible for a vertex shader to get used with a
fragment
       * program (and vice versa) here, but in practice that shouldn't
ever
@@ -152,6 +153,17 @@ update_program(struct gl_context *ctx)
         _mesa_reference_fragprog(ctx,
&ctx->FragmentProgram._TexEnvProgram,
                      NULL);
      }
+   else if (ctx->ATIFragmentShader._Enabled &&
+            ctx->ATIFragmentShader.Current->Program) {
+       /* Use the enabled ATI fragment shader's associated program */
+      _mesa_reference_shader_program(ctx,
+
&ctx->_Shader->_CurrentFragmentProgram,
+                                     NULL);
+      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current,
+
gl_fragment_program(ctx->ATIFragmentShader.Current->Program));
+      _mesa_reference_fragprog(ctx,
&ctx->FragmentProgram._TexEnvProgram,
+                               NULL);
+   }
      else if (ctx->FragmentProgram._MaintainTexEnvProgram) {
         /* Use fragment program generated from fixed-function state */
         struct gl_shader_program *f =
_mesa_get_fixed_func_fragment_program(ctx);

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to