From 04cbad84e8241ced16f146e36b6959e4c78cfac1 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 17 Feb 2003 15:38:03 +0000 Subject: Implement parsing of texture instructions and prototype execution. Misc parser clean-ups. --- src/mesa/swrast/s_nvfragprog.c | 107 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) (limited to 'src/mesa/swrast/s_nvfragprog.c') diff --git a/src/mesa/swrast/s_nvfragprog.c b/src/mesa/swrast/s_nvfragprog.c index 0980b5dab0..6ff4569a8e 100644 --- a/src/mesa/swrast/s_nvfragprog.c +++ b/src/mesa/swrast/s_nvfragprog.c @@ -1,4 +1,4 @@ -/* $Id: s_nvfragprog.c,v 1.1 2003/01/14 04:57:47 brianp Exp $ */ +/* $Id: s_nvfragprog.c,v 1.2 2003/02/17 15:38:04 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -36,6 +36,73 @@ #include "s_nvfragprog.h" +/** + * Fetch a texel. + */ +static void +fetch_texel( GLcontext *ctx, const GLfloat texcoord[4], GLuint unit, + GLenum target, GLfloat color[4] ) +{ + const struct gl_texture_object *texObj; + + /* XXX Use swrast->TextureSample[texUnit]() to sample texture. + * Needs to be swrast->TextureSample[target][texUnit]() though. + */ + + switch (target) { + case GL_TEXTURE_1D: + texObj = ctx->Texture.Unit[unit].Current1D; + break; + case GL_TEXTURE_2D: + texObj = ctx->Texture.Unit[unit].Current2D; + break; + case GL_TEXTURE_3D: + texObj = ctx->Texture.Unit[unit].Current3D; + break; + case GL_TEXTURE_CUBE_MAP: + texObj = ctx->Texture.Unit[unit].CurrentCubeMap; + break; + case GL_TEXTURE_RECTANGLE_NV: + texObj = ctx->Texture.Unit[unit].CurrentRect; + break; + default: + _mesa_problem(ctx, "Invalid target in fetch_texel"); + } + + if (texObj->Complete) { + const struct gl_texture_image *texImage; + GLint col, row, img; + GLchan texel[4]; + col = IROUND(texcoord[0] * texImage->Width); /* XXX temporary! */ + row = IROUND(texcoord[1] * texImage->Height); /* XXX temporary! */ + img = 0; + texImage->FetchTexel(texImage, col, row, img, texel); + /* XXX texture format? */ + color[0] = CHAN_TO_FLOAT(texel[0]); + color[1] = CHAN_TO_FLOAT(texel[1]); + color[2] = CHAN_TO_FLOAT(texel[2]); + color[3] = CHAN_TO_FLOAT(texel[3]); + } + else { + ASSIGN_4V(color, 0.0, 0.0, 0.0, 0.0); + } +} + + +/** + * Fetch a texel w/ partial derivatives. + */ +static void +fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4], + const GLfloat dtdx[4], const GLfloat dtdy[4], + GLuint unit, GLenum target, GLfloat color[4] ) +{ + /* XXX to do */ + +} + + + /** * Fetch a 4-element float vector from the given source register. * Apply swizzling and negating as needed. @@ -315,6 +382,44 @@ execute_program(GLcontext *ctx, const struct fragment_program *program) inst->UpdateCondRegister ); } break; + case FP_OPCODE_TEX: + /* Texel lookup */ + { + GLfloat texcoord[4], color[4]; + fetch_vector4( &inst->SrcReg[0], machine, texcoord ); + fetch_texel( ctx, texcoord, inst->TexSrcUnit, + inst->TexSrcTarget, color ); + store_vector4( &inst->DstReg, machine, color, inst->Saturate, + inst->UpdateCondRegister ); + } + break; + case FP_OPCODE_TXD: + /* Texture lookup w/ partial derivatives for LOD */ + { + GLfloat texcoord[4], dtdx[4], dtdy[4], color[4]; + fetch_vector4( &inst->SrcReg[0], machine, texcoord ); + fetch_vector4( &inst->SrcReg[1], machine, dtdx ); + fetch_vector4( &inst->SrcReg[2], machine, dtdy ); + fetch_texel_deriv( ctx, texcoord, dtdx, dtdy, inst->TexSrcUnit, + inst->TexSrcTarget, color ); + store_vector4( &inst->DstReg, machine, color, inst->Saturate, + inst->UpdateCondRegister ); + } + break; + case FP_OPCODE_TXP: + /* Texture lookup w/ perspective divide */ + { + GLfloat texcoord[4], color[4]; + fetch_vector4( &inst->SrcReg[0], machine, texcoord ); + texcoord[0] /= texcoord[3]; + texcoord[1] /= texcoord[3]; + texcoord[2] /= texcoord[3]; + fetch_texel( ctx, texcoord, inst->TexSrcUnit, + inst->TexSrcTarget, color ); + store_vector4( &inst->DstReg, machine, color, inst->Saturate, + inst->UpdateCondRegister ); + } + break; default: _mesa_problem(ctx, "Bad opcode in _mesa_exec_fragment_program"); return; -- cgit v1.2.3