r300_select_vertex_shader4:
[mesa.git] / src / mesa / drivers / dri / r300 / r300_shader.c
1 #include "glheader.h"
2 #include "macros.h"
3 #include "enums.h"
4
5 #include "program.h"
6 #include "tnl/tnl.h"
7 #include "r300_context.h"
8 #include "r300_fragprog.h"
9
10 static void
11 r300BindProgram(GLcontext *ctx, GLenum target, struct gl_program *prog)
12 {
13
14 r300ContextPtr rmesa = R300_CONTEXT(ctx);
15 struct r300_vertex_program_cont *vp=(void *)prog;
16
17
18 switch(target){
19 case GL_VERTEX_PROGRAM_ARB:
20 //rmesa->curr_vp = (struct gl_vertex_program *)vp;
21 //vp->ref_count++;
22 #if 0
23 if((vp->ref_count % 1500) == 0) {
24 fprintf(stderr, "id %p, ref_count %d\n", vp, vp->ref_count);
25 _mesa_print_program(&vp->mesa_program.Base);
26 }
27 #endif
28
29 case GL_FRAGMENT_PROGRAM_ARB:
30 break;
31 default:
32 WARN_ONCE("Target not supported yet!\n");
33 break;
34 }
35 }
36
37 static struct gl_program *
38 r300NewProgram(GLcontext *ctx, GLenum target, GLuint id)
39 {
40 struct r300_vertex_program_cont *vp;
41 struct r300_fragment_program *fp;
42
43 switch(target){
44 case GL_VERTEX_STATE_PROGRAM_NV:
45 case GL_VERTEX_PROGRAM_ARB:
46 vp=CALLOC_STRUCT(r300_vertex_program_cont);
47 return _mesa_init_vertex_program(ctx, &vp->mesa_program, target, id);
48 case GL_FRAGMENT_PROGRAM_ARB:
49 fp=CALLOC_STRUCT(r300_fragment_program);
50 fp->ctx = ctx;
51 return _mesa_init_fragment_program(ctx, &fp->mesa_program, target, id);
52 case GL_FRAGMENT_PROGRAM_NV:
53 fp=CALLOC_STRUCT(r300_fragment_program);
54 return _mesa_init_fragment_program(ctx, &fp->mesa_program, target, id);
55 default:
56 _mesa_problem(ctx, "Bad target in r300NewProgram");
57 }
58
59 return NULL;
60 }
61
62
63 static void
64 r300DeleteProgram(GLcontext *ctx, struct gl_program *prog)
65 {
66 #if 0
67 r300ContextPtr rmesa = R300_CONTEXT(ctx);
68 struct r300_vertex_program *vp=(void *)prog;
69
70 if(rmesa->curr_vp == vp)
71 rmesa->curr_vp = NULL;
72 #endif
73
74 _mesa_delete_program(ctx, prog);
75 }
76
77 static void
78 r300ProgramStringNotify(GLcontext *ctx, GLenum target, struct gl_program *prog)
79 {
80 struct r300_vertex_program_cont *vp=(void *)prog;
81 struct r300_fragment_program *fp = (struct r300_fragment_program *) prog;
82
83 switch(target) {
84 case GL_VERTEX_PROGRAM_ARB:
85 vp->progs = NULL;
86 /*vp->translated = GL_FALSE;
87 memset(&vp->translated, 0, sizeof(struct r300_vertex_program) - sizeof(struct gl_vertex_program));*/
88 /*r300_translate_vertex_shader(vp);*/
89 break;
90 case GL_FRAGMENT_PROGRAM_ARB:
91 fp->translated = GL_FALSE;
92 break;
93 }
94 /* need this for tcl fallbacks */
95 _tnl_program_string(ctx, target, prog);
96 }
97
98 static GLboolean
99 r300IsProgramNative(GLcontext *ctx, GLenum target, struct gl_program *prog)
100 {
101 //struct r300_vertex_program *vp=(void *)prog;
102 //r300ContextPtr rmesa = R300_CONTEXT(ctx);
103
104 return 1;
105 }
106
107 void r300InitShaderFuncs(struct dd_function_table *functions)
108 {
109 functions->NewProgram=r300NewProgram;
110 functions->BindProgram=r300BindProgram;
111 functions->DeleteProgram=r300DeleteProgram;
112 functions->ProgramStringNotify=r300ProgramStringNotify;
113 functions->IsProgramNative=r300IsProgramNative;
114 }