Support 16-bit modes.
[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 "r300_context.h"
7 #include "nvvertprog.h"
8 #if USE_ARB_F_P == 1
9 #include "r300_fragprog.h"
10 #endif
11
12 static void r300BindProgram(GLcontext *ctx, GLenum target, struct program *prog)
13 {
14 r300ContextPtr rmesa = R300_CONTEXT(ctx);
15 struct r300_vertex_program *vp=(void *)prog;
16
17 switch(target){
18 case GL_VERTEX_PROGRAM_ARB:
19 #if USE_ARB_F_P == 1
20 case GL_FRAGMENT_PROGRAM_ARB:
21 #endif
22 //rmesa->current_vp = vp;
23 break;
24 default:
25 WARN_ONCE("Target not supported yet!\n");
26 break;
27 }
28 }
29
30 static struct program *r300NewProgram(GLcontext *ctx, GLenum target, GLuint id)
31 {
32 struct r300_vertex_program *vp;
33 #if USE_ARB_F_P == 1
34 struct r300_fragment_program *fp;
35 #else
36 struct fragment_program *fp;
37 #endif
38 struct ati_fragment_shader *afs;
39
40 switch(target){
41 case GL_VERTEX_PROGRAM_ARB:
42 vp=CALLOC_STRUCT(r300_vertex_program);
43 return _mesa_init_vertex_program(ctx, &vp->mesa_program, target, id);
44
45 case GL_FRAGMENT_PROGRAM_ARB:
46 #if USE_ARB_F_P == 1
47 fp=CALLOC_STRUCT(r300_fragment_program);
48 fp->ctx = ctx;
49 return _mesa_init_fragment_program(ctx, &fp->mesa_program, target, id);
50 #else
51 fp=CALLOC_STRUCT(fragment_program);
52 return _mesa_init_fragment_program(ctx, fp, target, id);
53 #endif
54 case GL_FRAGMENT_PROGRAM_NV:
55 fp=CALLOC_STRUCT(fragment_program);
56 return _mesa_init_fragment_program(ctx, fp, target, id);
57
58 case GL_FRAGMENT_SHADER_ATI:
59 afs=CALLOC_STRUCT(ati_fragment_shader);
60 return _mesa_init_ati_fragment_shader(ctx, afs, target, id);
61 }
62
63 return NULL;
64 }
65
66
67 static void r300DeleteProgram(GLcontext *ctx, struct program *prog)
68 {
69 //r300ContextPtr rmesa = R300_CONTEXT(ctx);
70 //struct r300_vertex_program *vp=(void *)prog;
71
72 _mesa_delete_program(ctx, prog);
73 }
74
75 void r300ProgramStringNotify(GLcontext *ctx, GLenum target,
76 struct program *prog)
77 {
78 struct r300_vertex_program *vp=(void *)prog;
79 #if USE_ARB_F_P == 1
80 struct r300_fragment_program *fp=(void *)prog;
81 #endif
82
83 switch(target) {
84 case GL_VERTEX_PROGRAM_ARB:
85 /*vp->translated=GL_FALSE;
86 translate_vertex_shader(vp);*/
87 //debug_vp(ctx, vp);
88 break;
89 case GL_FRAGMENT_PROGRAM_ARB:
90 #if USE_ARB_F_P == 1
91 fp->translated = GL_FALSE;
92 #endif
93 break;
94 }
95 }
96
97 static GLboolean r300IsProgramNative(GLcontext *ctx, GLenum target, struct program *prog)
98 {
99 //struct r300_vertex_program *vp=(void *)prog;
100 //r300ContextPtr rmesa = R300_CONTEXT(ctx);
101
102 return 1;
103 }
104
105 void r300InitShaderFuncs(struct dd_function_table *functions)
106 {
107 functions->NewProgram=r300NewProgram;
108 functions->BindProgram=r300BindProgram;
109 functions->DeleteProgram=r300DeleteProgram;
110 functions->ProgramStringNotify=r300ProgramStringNotify;
111 functions->IsProgramNative=r300IsProgramNative;
112 }