summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
authorVladimir Dergachev <volodya@freedesktop.org>2005-02-21 06:09:30 +0000
committerVladimir Dergachev <volodya@freedesktop.org>2005-02-21 06:09:30 +0000
commite00b72971629e41d5ac0e85391a466655c790d66 (patch)
tree88a4919e57b9692d1dfe691dc74ba8cab30242af /src/mesa/drivers/dri
parenta2990a9d730e1fe579debbe0e4a7be46c5c2329b (diff)
Add code to autogenerate vertex shaders.
This is needed for multitexturing to work properly.
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r--src/mesa/drivers/dri/r300/r300_context.h5
-rw-r--r--src/mesa/drivers/dri/r300/r300_maos.c13
-rw-r--r--src/mesa/drivers/dri/r300/r300_state.c102
3 files changed, 113 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h
index ae9711d551..f4911fd311 100644
--- a/src/mesa/drivers/dri/r300/r300_context.h
+++ b/src/mesa/drivers/dri/r300/r300_context.h
@@ -666,7 +666,10 @@ struct r300_state {
struct r300_dma_region elt_ao;
GLuint render_inputs; /* actual render inputs that R300 was configured for.
- They are the same as tnl->render_inputs for fixed pipeline */
+ They are the same as tnl->render_inputs for fixed pipeline */
+ struct {
+ int transform_offset; /* Transform matrix offset, -1 if none */
+ } vap_param; /* vertex processor parameter allocation - tells where to write parameters */
int hw_stencil;
};
diff --git a/src/mesa/drivers/dri/r300/r300_maos.c b/src/mesa/drivers/dri/r300/r300_maos.c
index af5d00892a..04abe8c54f 100644
--- a/src/mesa/drivers/dri/r300/r300_maos.c
+++ b/src/mesa/drivers/dri/r300/r300_maos.c
@@ -304,7 +304,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
GLuint i;
GLuint inputs = 0;
-#define CONFIGURE_AOS(f, v, sz, cn) { \
+#define CONFIGURE_AOS(r, f, v, sz, cn) { \
if (RADEON_DEBUG & DEBUG_STATE) \
fprintf(stderr, "Enabling "#v "\n"); \
if (++nr >= R300_MAX_AOS_ARRAYS) { \
@@ -326,6 +326,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
sz, \
v->stride, \
cn); \
+ rmesa->state.vap_reg.r=rmesa->state.aos[nr-1].aos_reg; \
} \
}
@@ -362,7 +363,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
rmesa->state.render_inputs = inputs;
if (inputs & _TNL_BIT_POS) {
- CONFIGURE_AOS( AOS_FORMAT_FLOAT,
+ CONFIGURE_AOS(i_coords, AOS_FORMAT_FLOAT,
VB->ObjPtr,
immd ? 4 : VB->ObjPtr->size,
count);
@@ -371,7 +372,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
}
if (inputs & _TNL_BIT_NORMAL) {
- CONFIGURE_AOS( AOS_FORMAT_FLOAT,
+ CONFIGURE_AOS(i_normal, AOS_FORMAT_FLOAT,
VB->NormalPtr,
immd ? 4 : VB->NormalPtr->size,
count);
@@ -392,7 +393,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
}
}
- CONFIGURE_AOS( AOS_FORMAT_FLOAT_COLOR,
+ CONFIGURE_AOS(i_color[0], AOS_FORMAT_FLOAT_COLOR,
VB->ColorPtr[0],
immd ? 4 : emitsize,
count);
@@ -401,7 +402,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
}
if (inputs & _TNL_BIT_COLOR1) {
- CONFIGURE_AOS( AOS_FORMAT_FLOAT_COLOR,
+ CONFIGURE_AOS(i_color[1], AOS_FORMAT_FLOAT_COLOR,
VB->SecondaryColorPtr[0],
immd ? 4 : VB->SecondaryColorPtr[0]->size,
count);
@@ -418,7 +419,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
if (inputs & (_TNL_BIT_TEX0 << i)) {
- CONFIGURE_AOS( AOS_FORMAT_FLOAT,
+ CONFIGURE_AOS(i_tex[i], AOS_FORMAT_FLOAT,
VB->TexCoordPtr[i],
immd ? 4 : VB->TexCoordPtr[i]->size,
count);
diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c
index b47957054d..1229cd678b 100644
--- a/src/mesa/drivers/dri/r300/r300_state.c
+++ b/src/mesa/drivers/dri/r300/r300_state.c
@@ -1504,6 +1504,105 @@ void static inline setup_vertex_shader_fragment(r300ContextPtr r300, int dest, s
void r300SetupVertexProgram(r300ContextPtr rmesa);
+/* just a skeleton for now.. */
+
+/* Generate a vertex shader that simply transforms vertex and texture coordinates,
+ while leaving colors intact. Nothing fancy (like lights)
+
+ If implementing lights make a copy first, so it is easy to switch between the two versions */
+void r300GenerateSimpleVertexShader(r300ContextPtr r300)
+{
+ int i;
+
+ /* Allocate parameters */
+ r300->state.vap_param.transform_offset=0x0; /* transform matrix */
+ r300->state.vertex_shader.param_offset=0x0;
+ r300->state.vertex_shader.param_count=0x4; /* 4 vector values - 4x4 matrix */
+
+ r300->state.vertex_shader.program_start=0x0;
+ r300->state.vertex_shader.unknown_ptr1=0x4; /* magic value ? */
+ r300->state.vertex_shader.program_end=0x0;
+
+ r300->state.vertex_shader.unknown_ptr2=0x0; /* magic value */
+ r300->state.vertex_shader.unknown_ptr3=0x4; /* magic value */
+
+ /* Initialize matrix and vector parameters.. these should really be restructured */
+ /* TODO: fix vertex_shader structure */
+ r300->state.vertex_shader.matrix[0].length=16;
+ r300->state.vertex_shader.matrix[1].length=0;
+ r300->state.vertex_shader.matrix[2].length=0;
+ r300->state.vertex_shader.vector[0].length=0;
+ r300->state.vertex_shader.vector[1].length=0;
+ r300->state.vertex_shader.unknown1.length=0;
+ r300->state.vertex_shader.unknown2.length=0;
+
+#define WRITE_OP(oper,source1,source2,source3) {\
+ r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].op=(oper); \
+ r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].src1=(source1); \
+ r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].src2=(source2); \
+ r300->state.vertex_shader.program.body.i[r300->state.vertex_shader.program_end].src3=(source3); \
+ r300->state.vertex_shader.program_end++; \
+ }
+
+ /* Multiply vertex coordinates with transform matrix */
+
+ WRITE_OP(
+ EASY_VSF_OP(MUL, 0, ALL, TMP),
+ VSF_PARAM(3),
+ VSF_ATTR_W(0),
+ EASY_VSF_SOURCE(0, W, W, W, W, NONE, NONE)
+ )
+
+ WRITE_OP(
+ EASY_VSF_OP(MUL, 1, ALL, RESULT),
+ VSF_REG(1),
+ VSF_ATTR_UNITY(1),
+ VSF_UNITY(1)
+ )
+
+ WRITE_OP(
+ EASY_VSF_OP(MAD, 0, ALL, TMP),
+ VSF_PARAM(2),
+ VSF_ATTR_Z(0),
+ VSF_TMP(0)
+ )
+
+ WRITE_OP(
+ EASY_VSF_OP(MAD, 0, ALL, TMP),
+ VSF_PARAM(1),
+ VSF_ATTR_Y(0),
+ VSF_TMP(0)
+ )
+
+ WRITE_OP(
+ EASY_VSF_OP(MAD, 0, ALL, RESULT),
+ VSF_PARAM(0),
+ VSF_ATTR_X(0),
+ VSF_TMP(0)
+ )
+
+ /* Pass through texture coordinates, if any */
+ for(i=0;i < r300->radeon.glCtx->Const.MaxTextureUnits;i++)
+ if(r300->state.render_inputs & (_TNL_BIT_TEX0<<i)){
+ // fprintf(stderr, "i_tex[%d]=%d\n", i, r300->state.vap_reg.i_tex[i]);
+ WRITE_OP(
+ EASY_VSF_OP(MUL, 2+i, ALL, RESULT),
+ VSF_REG(r300->state.vap_reg.i_tex[i]),
+ VSF_ATTR_UNITY(r300->state.vap_reg.i_tex[i]),
+ VSF_UNITY(r300->state.vap_reg.i_tex[i])
+ )
+ }
+
+ r300->state.vertex_shader.program_end--; /* r300 wants program length to be one more - no idea why */
+ r300->state.vertex_shader.program.length=(r300->state.vertex_shader.program_end+1)*4;
+
+ r300->state.vertex_shader.unknown_ptr1=r300->state.vertex_shader.program_end; /* magic value ? */
+ r300->state.vertex_shader.unknown_ptr2=r300->state.vertex_shader.program_end; /* magic value ? */
+ r300->state.vertex_shader.unknown_ptr3=r300->state.vertex_shader.program_end; /* magic value ? */
+
+}
+
+
void r300SetupVertexShader(r300ContextPtr rmesa)
{
GLcontext* ctx = rmesa->radeon.glCtx;
@@ -1522,13 +1621,16 @@ void r300SetupVertexShader(r300ContextPtr rmesa)
/* This needs to be replaced by vertex shader generation code */
+#if 0
/* textures enabled ? */
if(rmesa->state.texture.tc_count>0){
rmesa->state.vertex_shader=SINGLE_TEXTURE_VERTEX_SHADER;
} else {
rmesa->state.vertex_shader=FLAT_COLOR_VERTEX_SHADER;
}
+#endif
+ r300GenerateSimpleVertexShader(rmesa);
rmesa->state.vertex_shader.matrix[0].length=16;
memcpy(rmesa->state.vertex_shader.matrix[0].body.f, ctx->_ModelProjectMatrix.m, 16*4);