summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker/st_cb_program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker/st_cb_program.c')
-rw-r--r--src/mesa/state_tracker/st_cb_program.c60
1 files changed, 52 insertions, 8 deletions
diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
index 2361b2eddf..6aa7e79af9 100644
--- a/src/mesa/state_tracker/st_cb_program.c
+++ b/src/mesa/state_tracker/st_cb_program.c
@@ -33,10 +33,9 @@
#include "main/glheader.h"
#include "main/macros.h"
#include "main/enums.h"
-#include "shader/prog_instruction.h"
-#include "shader/prog_parameter.h"
-#include "shader/program.h"
-#include "shader/shader_api.h"
+#include "main/shaderapi.h"
+#include "program/prog_instruction.h"
+#include "program/program.h"
#include "cso_cache/cso_context.h"
#include "draw/draw_context.h"
@@ -67,6 +66,9 @@ static void st_bind_program( GLcontext *ctx,
case GL_FRAGMENT_PROGRAM_ARB:
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
break;
+ case MESA_GEOMETRY_PROGRAM:
+ st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;
+ break;
}
}
@@ -75,15 +77,13 @@ static void st_bind_program( GLcontext *ctx,
* Called via ctx->Driver.UseProgram() to bind a linked GLSL program
* (vertex shader + fragment shader).
*/
-static void st_use_program( GLcontext *ctx,
- GLuint program )
+static void st_use_program( GLcontext *ctx, struct gl_shader_program *shProg)
{
struct st_context *st = st_context(ctx);
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
-
- _mesa_use_program(ctx, program);
+ st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;
}
@@ -120,6 +120,17 @@ static struct gl_program *st_new_program( GLcontext *ctx,
id );
}
+ case MESA_GEOMETRY_PROGRAM: {
+ struct st_geometry_program *prog = ST_CALLOC_STRUCT(st_geometry_program);
+
+ prog->serialNo = SerialNo++;
+
+ return _mesa_init_geometry_program( ctx,
+ &prog->Base,
+ target,
+ id );
+ }
+
default:
assert(0);
return NULL;
@@ -139,6 +150,21 @@ st_delete_program(GLcontext *ctx, struct gl_program *prog)
st_vp_release_varients( st, stvp );
}
break;
+ case MESA_GEOMETRY_PROGRAM:
+ {
+ struct st_geometry_program *stgp = (struct st_geometry_program *) prog;
+
+ if (stgp->driver_shader) {
+ cso_delete_geometry_shader(st->cso_context, stgp->driver_shader);
+ stgp->driver_shader = NULL;
+ }
+
+ if (stgp->tgsi.tokens) {
+ st_free_tokens((void *) stgp->tgsi.tokens);
+ stgp->tgsi.tokens = NULL;
+ }
+ }
+ break;
case GL_FRAGMENT_PROGRAM_ARB:
{
struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
@@ -201,6 +227,24 @@ static GLboolean st_program_string_notify( GLcontext *ctx,
if (st->fp == stfp)
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
}
+ else if (target == MESA_GEOMETRY_PROGRAM) {
+ struct st_geometry_program *stgp = (struct st_geometry_program *) prog;
+
+ stgp->serialNo++;
+
+ if (stgp->driver_shader) {
+ cso_delete_geometry_shader(st->cso_context, stgp->driver_shader);
+ stgp->driver_shader = NULL;
+ }
+
+ if (stgp->tgsi.tokens) {
+ st_free_tokens((void *) stgp->tgsi.tokens);
+ stgp->tgsi.tokens = NULL;
+ }
+
+ if (st->gp == stgp)
+ st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;
+ }
else if (target == GL_VERTEX_PROGRAM_ARB) {
struct st_vertex_program *stvp = (struct st_vertex_program *) prog;