summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/r300/r300_shader.c
blob: 8f60bb3d00892645b3b076325fcd282839bfdb76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "glheader.h"
#include "macros.h"
#include "enums.h"

#include "program.h"
#include "r300_context.h"
#include "program_instruction.h"
#if USE_ARB_F_P == 1
#include "r300_fragprog.h"
#endif

static void r300BindProgram(GLcontext *ctx, GLenum target, struct program *prog)
{
	
	r300ContextPtr rmesa = R300_CONTEXT(ctx);
	struct r300_vertex_program *vp=(void *)prog;
	
	
	switch(target){
		case GL_VERTEX_PROGRAM_ARB:
		rmesa->curr_vp = vp;
		vp->ref_count++;
#if 0
		if((vp->ref_count % 1500) == 0) {
			fprintf(stderr, "id %p, ref_count %d\n", vp, vp->ref_count);
			_mesa_print_program(&vp->mesa_program.Base);
		}
#endif
		
#if USE_ARB_F_P == 1
		case GL_FRAGMENT_PROGRAM_ARB:
#endif
			//rmesa->current_vp = vp;
		break;
		default:
			WARN_ONCE("Target not supported yet!\n");
		break;
	}
}

static struct program *r300NewProgram(GLcontext *ctx, GLenum target, GLuint id)
{
	struct r300_vertex_program *vp;
#if USE_ARB_F_P == 1
	struct r300_fragment_program *fp;
#else
	struct fragment_program *fp;
#endif
	struct ati_fragment_shader *afs;
	
	switch(target){
		case GL_VERTEX_STATE_PROGRAM_NV:
		case GL_VERTEX_PROGRAM_ARB:
			vp=CALLOC_STRUCT(r300_vertex_program);
			return _mesa_init_vertex_program(ctx, &vp->mesa_program, target, id);
		case GL_FRAGMENT_PROGRAM_ARB:
#if USE_ARB_F_P == 1
			fp=CALLOC_STRUCT(r300_fragment_program);
			fp->ctx = ctx;
			return _mesa_init_fragment_program(ctx, &fp->mesa_program, target, id);
#else
			fp=CALLOC_STRUCT(fragment_program);
			return _mesa_init_fragment_program(ctx, fp, target, id);
#endif	
		case GL_FRAGMENT_PROGRAM_NV:
#if USE_ARB_F_P == 1
			fp=CALLOC_STRUCT(r300_fragment_program);
			return _mesa_init_fragment_program(ctx, &fp->mesa_program, target, id);
#else
			fp=CALLOC_STRUCT(fragment_program);
			return _mesa_init_fragment_program(ctx, fp, target, id);
#endif
#if 00
                /* _mesa_new_ati_fragment_shader() is now called instead */
		case GL_FRAGMENT_SHADER_ATI:
			afs=CALLOC_STRUCT(ati_fragment_shader);
			return _mesa_init_ati_fragment_shader(ctx, afs, target, id);
#endif
		default:
			_mesa_problem(ctx, "Bad target in r300NewProgram");
	}
	
	return NULL;	
}


static void r300DeleteProgram(GLcontext *ctx, struct program *prog)
{
	r300ContextPtr rmesa = R300_CONTEXT(ctx);
	struct r300_vertex_program *vp=(void *)prog;
	
	/*if(rmesa->curr_vp == vp)
		rmesa->curr_vp = NULL;*/
	
	_mesa_delete_program(ctx, prog);
}

static void r300ProgramStringNotify(GLcontext *ctx, GLenum target, 
				struct program *prog)
{
	struct r300_vertex_program *vp=(void *)prog;
#if USE_ARB_F_P == 1
	struct r300_fragment_program *fp = (struct r300_fragment_program *) prog;
#endif
	
	switch(target) {
	case GL_VERTEX_PROGRAM_ARB:
		vp->translated = GL_FALSE;
		memset(&vp->translated, 0, sizeof(struct r300_vertex_program) - sizeof(struct vertex_program));
		/*translate_vertex_shader(vp);*/
	break;
	case GL_FRAGMENT_PROGRAM_ARB:
#if USE_ARB_F_P == 1
		fp->translated = GL_FALSE;
#endif
	break;
	}
}

static GLboolean r300IsProgramNative(GLcontext *ctx, GLenum target, struct program *prog)
{
	//struct r300_vertex_program *vp=(void *)prog;
	//r300ContextPtr rmesa = R300_CONTEXT(ctx);

	return 1;
}

void r300InitShaderFuncs(struct dd_function_table *functions)
{
	functions->NewProgram=r300NewProgram;
	functions->BindProgram=r300BindProgram;
	functions->DeleteProgram=r300DeleteProgram;
	functions->ProgramStringNotify=r300ProgramStringNotify;
	functions->IsProgramNative=r300IsProgramNative;
}