#include "st_mesa_to_tgsi.h"
#include "st_cb_program.h"
#include "st_glsl_to_tgsi.h"
+#include "st_atifs_to_tgsi.h"
case GL_GEOMETRY_PROGRAM_NV:
st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;
break;
+ case GL_TESS_CONTROL_PROGRAM_NV:
+ st->dirty.st |= ST_NEW_TESSCTRL_PROGRAM;
+ break;
+ case GL_TESS_EVALUATION_PROGRAM_NV:
+ st->dirty.st |= ST_NEW_TESSEVAL_PROGRAM;
+ break;
+ case GL_COMPUTE_PROGRAM_NV:
+ st->dirty_cp.st |= ST_NEW_COMPUTE_PROGRAM;
+ break;
}
}
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;
+ st->dirty.st |= ST_NEW_TESSCTRL_PROGRAM;
+ st->dirty.st |= ST_NEW_TESSEVAL_PROGRAM;
+ st->dirty_cp.st |= ST_NEW_COMPUTE_PROGRAM;
}
switch (target) {
case GL_VERTEX_PROGRAM_ARB: {
struct st_vertex_program *prog = ST_CALLOC_STRUCT(st_vertex_program);
- return _mesa_init_vertex_program(ctx, &prog->Base, target, id);
+ return _mesa_init_gl_program(&prog->Base.Base, target, id);
}
-
case GL_FRAGMENT_PROGRAM_ARB: {
struct st_fragment_program *prog = ST_CALLOC_STRUCT(st_fragment_program);
- return _mesa_init_fragment_program(ctx, &prog->Base, target, id);
+ return _mesa_init_gl_program(&prog->Base.Base, target, id);
}
-
case GL_GEOMETRY_PROGRAM_NV: {
struct st_geometry_program *prog = ST_CALLOC_STRUCT(st_geometry_program);
- return _mesa_init_geometry_program(ctx, &prog->Base, target, id);
+ return _mesa_init_gl_program(&prog->Base.Base, target, id);
+ }
+ case GL_TESS_CONTROL_PROGRAM_NV: {
+ struct st_tessctrl_program *prog = ST_CALLOC_STRUCT(st_tessctrl_program);
+ return _mesa_init_gl_program(&prog->Base.Base, target, id);
+ }
+ case GL_TESS_EVALUATION_PROGRAM_NV: {
+ struct st_tesseval_program *prog = ST_CALLOC_STRUCT(st_tesseval_program);
+ return _mesa_init_gl_program(&prog->Base.Base, target, id);
+ }
+ case GL_COMPUTE_PROGRAM_NV: {
+ struct st_compute_program *prog = ST_CALLOC_STRUCT(st_compute_program);
+ return _mesa_init_gl_program(&prog->Base.Base, target, id);
}
-
default:
assert(0);
return NULL;
struct st_geometry_program *stgp =
(struct st_geometry_program *) prog;
- st_release_gp_variants(st, stgp);
+ st_release_basic_variants(st, stgp->Base.Base.Target,
+ &stgp->variants, &stgp->tgsi);
if (stgp->glsl_to_tgsi)
free_glsl_to_tgsi_visitor(stgp->glsl_to_tgsi);
free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi);
}
break;
+ case GL_TESS_CONTROL_PROGRAM_NV:
+ {
+ struct st_tessctrl_program *sttcp =
+ (struct st_tessctrl_program *) prog;
+
+ st_release_basic_variants(st, sttcp->Base.Base.Target,
+ &sttcp->variants, &sttcp->tgsi);
+
+ if (sttcp->glsl_to_tgsi)
+ free_glsl_to_tgsi_visitor(sttcp->glsl_to_tgsi);
+ }
+ break;
+ case GL_TESS_EVALUATION_PROGRAM_NV:
+ {
+ struct st_tesseval_program *sttep =
+ (struct st_tesseval_program *) prog;
+
+ st_release_basic_variants(st, sttep->Base.Base.Target,
+ &sttep->variants, &sttep->tgsi);
+
+ if (sttep->glsl_to_tgsi)
+ free_glsl_to_tgsi_visitor(sttep->glsl_to_tgsi);
+ }
+ break;
+ case GL_COMPUTE_PROGRAM_NV:
+ {
+ struct st_compute_program *stcp =
+ (struct st_compute_program *) prog;
+
+ st_release_cp_variants(st, stcp);
+
+ if (stcp->glsl_to_tgsi)
+ free_glsl_to_tgsi_visitor(stcp->glsl_to_tgsi);
+ }
+ break;
default:
assert(0); /* problem */
}
}
-/**
- * Called via ctx->Driver.IsProgramNative()
- */
-static GLboolean
-st_is_program_native(struct gl_context *ctx,
- GLenum target,
- struct gl_program *prog)
-{
- return GL_TRUE;
-}
-
-
/**
* Called via ctx->Driver.ProgramStringNotify()
* Called when the program's text/code is changed. We have to free
struct gl_program *prog )
{
struct st_context *st = st_context(ctx);
+ gl_shader_stage stage = _mesa_program_enum_to_shader_stage(target);
if (target == GL_FRAGMENT_PROGRAM_ARB) {
struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
st_release_fp_variants(st, stfp);
+ if (!st_translate_fragment_program(st, stfp))
+ return false;
if (st->fp == stfp)
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
else if (target == GL_GEOMETRY_PROGRAM_NV) {
struct st_geometry_program *stgp = (struct st_geometry_program *) prog;
- st_release_gp_variants(st, stgp);
+ st_release_basic_variants(st, stgp->Base.Base.Target,
+ &stgp->variants, &stgp->tgsi);
+ if (!st_translate_geometry_program(st, stgp))
+ return false;
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;
- st_release_vp_variants( st, stvp );
+ st_release_vp_variants(st, stvp);
+ if (!st_translate_vertex_program(st, stvp))
+ return false;
if (st->vp == stvp)
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
}
+ else if (target == GL_TESS_CONTROL_PROGRAM_NV) {
+ struct st_tessctrl_program *sttcp =
+ (struct st_tessctrl_program *) prog;
+
+ st_release_basic_variants(st, sttcp->Base.Base.Target,
+ &sttcp->variants, &sttcp->tgsi);
+ if (!st_translate_tessctrl_program(st, sttcp))
+ return false;
+
+ if (st->tcp == sttcp)
+ st->dirty.st |= ST_NEW_TESSCTRL_PROGRAM;
+ }
+ else if (target == GL_TESS_EVALUATION_PROGRAM_NV) {
+ struct st_tesseval_program *sttep =
+ (struct st_tesseval_program *) prog;
+
+ st_release_basic_variants(st, sttep->Base.Base.Target,
+ &sttep->variants, &sttep->tgsi);
+ if (!st_translate_tesseval_program(st, sttep))
+ return false;
+
+ if (st->tep == sttep)
+ st->dirty.st |= ST_NEW_TESSEVAL_PROGRAM;
+ }
+ else if (target == GL_COMPUTE_PROGRAM_NV) {
+ struct st_compute_program *stcp =
+ (struct st_compute_program *) prog;
+
+ st_release_cp_variants(st, stcp);
+ if (!st_translate_compute_program(st, stcp))
+ return false;
+
+ if (st->cp == stcp)
+ st->dirty_cp.st |= ST_NEW_COMPUTE_PROGRAM;
+ }
+ else if (target == GL_FRAGMENT_SHADER_ATI) {
+ assert(prog);
- if (ST_DEBUG & DEBUG_PRECOMPILE)
+ struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
+ assert(stfp->ati_fs);
+ assert(stfp->ati_fs->Program == prog);
+
+ st_init_atifs_prog(ctx, prog);
+
+ st_release_fp_variants(st, stfp);
+ if (!st_translate_fragment_program(st, stfp))
+ return false;
+
+ if (st->fp == stfp)
+ st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
+ }
+
+ if (ST_DEBUG & DEBUG_PRECOMPILE ||
+ st->shader_has_one_variant[stage])
st_precompile_shader_variant(st, prog);
- /* XXX check if program is legal, within limits */
return GL_TRUE;
}
+/**
+ * Called via ctx->Driver.NewATIfs()
+ * Called in glEndFragmentShaderATI()
+ */
+static struct gl_program *
+st_new_ati_fs(struct gl_context *ctx, struct ati_fragment_shader *curProg)
+{
+ struct gl_program *prog = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB,
+ curProg->Id);
+ struct st_fragment_program *stfp = (struct st_fragment_program *)prog;
+ stfp->ati_fs = curProg;
+ return prog;
+}
/**
* Plug in the program and shader-related device driver functions.
functions->UseProgram = st_use_program;
functions->NewProgram = st_new_program;
functions->DeleteProgram = st_delete_program;
- functions->IsProgramNative = st_is_program_native;
functions->ProgramStringNotify = st_program_string_notify;
+ functions->NewATIfs = st_new_ati_fs;
functions->LinkShader = st_link_shader;
}