diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/common/meta.c | 144 | ||||
-rw-r--r-- | src/mesa/drivers/common/meta.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_context.c | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_extensions.c | 3 | ||||
-rw-r--r-- | src/mesa/tnl/t_draw.c | 12 |
5 files changed, 165 insertions, 0 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 05909cfa30..5c794ee443 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -229,6 +229,16 @@ struct gen_mipmap_state /** + * State for glDrawTex() + */ +struct drawtex_state +{ + GLuint ArrayObj; + GLuint VBO; +}; + + +/** * All per-context meta state. */ struct gl_meta_state @@ -243,6 +253,8 @@ struct gl_meta_state struct drawpix_state DrawPix; /**< For _mesa_meta_draw_pixels() */ struct bitmap_state Bitmap; /**< For _mesa_meta_bitmap() */ struct gen_mipmap_state Mipmap; /**< For _mesa_meta_generate_mipmap() */ + + struct drawtex_state DrawTex; /**< For _mesa_meta_draw_tex() */ }; @@ -299,6 +311,11 @@ _mesa_meta_free(GLcontext *ctx) _mesa_DeleteBuffersARB(1, & meta->Bitmap.VBO); _mesa_DeleteVertexArraysAPPLE(1, &meta->Bitmap.ArrayObj); _mesa_DeleteTextures(1, &meta->Bitmap.Tex.TexObj); + + /* glDrawTex */ + _mesa_DeleteBuffersARB(1, & meta->DrawTex.VBO); + _mesa_DeleteVertexArraysAPPLE(1, &meta->DrawTex.ArrayObj); + } _mesa_free(ctx->Meta); @@ -2037,3 +2054,130 @@ _mesa_meta_generate_mipmap(GLcontext *ctx, GLenum target, /* restore (XXX add to meta_begin/end()? */ _mesa_BindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboSave); } + + +#if FEATURE_OES_draw_texture + + +/** + * Meta implementation of ctx->Driver.DrawTex() in terms + * of texture mapping and polygon rendering. + */ +void +_mesa_meta_draw_tex(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, + GLfloat width, GLfloat height) +{ + struct drawtex_state *drawtex = &ctx->Meta->DrawTex; + struct vertex { + GLfloat x, y, z, st[MAX_TEXTURE_UNITS][2]; + }; + struct vertex verts[4]; + GLboolean vp_enabled; + GLuint i; + + _mesa_meta_begin(ctx, (META_RASTERIZATION | + META_TRANSFORM | + META_VERTEX | + META_VIEWPORT)); + vp_enabled = ctx->VertexProgram.Enabled; + if (vp_enabled) + _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE); + + if (drawtex->ArrayObj == 0) { + /* one-time setup */ + + /* create vertex array object */ + _mesa_GenVertexArrays(1, &drawtex->ArrayObj); + _mesa_BindVertexArray(drawtex->ArrayObj); + + /* create vertex array buffer */ + _mesa_GenBuffersARB(1, &drawtex->VBO); + _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, drawtex->VBO); + _mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(verts), + NULL, GL_DYNAMIC_DRAW_ARB); + + /* setup vertex arrays */ + _mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x)); + _mesa_EnableClientState(GL_VERTEX_ARRAY); + for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { + _mesa_ClientActiveTextureARB(GL_TEXTURE0 + i); + _mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(st[i])); + _mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY); + } + } + else { + _mesa_BindVertexArray(drawtex->ArrayObj); + _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, drawtex->VBO); + } + + /* vertex positions, texcoords */ + { + const GLfloat x1 = x + width * ctx->Pixel.ZoomX; + const GLfloat y1 = y + height * ctx->Pixel.ZoomY; + + verts[0].x = x; + verts[0].y = y; + verts[0].z = z; + + verts[1].x = x1; + verts[1].y = y; + verts[1].z = z; + + verts[2].x = x1; + verts[2].y = y1; + verts[2].z = z; + + verts[3].x = x; + verts[3].y = y1; + verts[3].z = z; + + for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { + const struct gl_texture_object *texObj; + const struct gl_texture_image *texImage; + GLfloat s, t, s1, t1; + GLuint tw, th; + + if (!ctx->Texture.Unit[i]._ReallyEnabled) { + GLuint j; + for (j = 0; j < 4; j++) { + verts[j].st[i][0] = 0.0f; + verts[j].st[i][1] = 0.0f; + } + continue; + } + + texObj = ctx->Texture.Unit[i]._Current; + texImage = texObj->Image[0][texObj->BaseLevel]; + tw = texImage->Width2; + th = texImage->Height2; + + s = (GLfloat) texObj->CropRect[0] / tw; + t = (GLfloat) texObj->CropRect[1] / th; + s1 = (GLfloat) (texObj->CropRect[0] + texObj->CropRect[2]) / tw; + t1 = (GLfloat) (texObj->CropRect[1] + texObj->CropRect[3]) / th; + + verts[0].st[i][0] = s; + verts[0].st[i][1] = t; + + verts[1].st[i][0] = s1; + verts[1].st[i][1] = t; + + verts[2].st[i][0] = s1; + verts[2].st[i][1] = t1; + + verts[3].st[i][0] = s; + verts[3].st[i][1] = t1; + } + + _mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts); + } + + _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4); + + if (vp_enabled) + _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_TRUE); + _mesa_meta_end(ctx); +} + + +#endif /* FEATURE_OES_draw_texture */ diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h index 171ad27f26..82d8b67af0 100644 --- a/src/mesa/drivers/common/meta.h +++ b/src/mesa/drivers/common/meta.h @@ -87,5 +87,8 @@ extern void _mesa_meta_generate_mipmap(GLcontext *ctx, GLenum target, struct gl_texture_object *texObj); +extern void +_mesa_meta_draw_tex(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, + GLfloat width, GLfloat height); #endif /* META_H */ diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 7a2e7617d0..fb7409c07e 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -604,6 +604,9 @@ intelInitDriverFunctions(struct dd_function_table *functions) intelInitBufferObjectFuncs(functions); intel_init_syncobj_functions(functions); +#if FEATURE_OES_draw_texture + functions->DrawTex = _mesa_meta_draw_tex; +#endif intelInitEGLImageFuncs(functions); } diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c b/src/mesa/drivers/dri/intel/intel_extensions.c index 21af22fbfb..3d01e2e028 100644 --- a/src/mesa/drivers/dri/intel/intel_extensions.c +++ b/src/mesa/drivers/dri/intel/intel_extensions.c @@ -182,6 +182,9 @@ static const struct dri_extension ttm_extensions[] = { #if FEATURE_OES_EGL_image { "GL_OES_EGL_image", NULL }, #endif +#if FEATURE_OES_draw_texture + { "GL_OES_draw_texture", NULL }, +#endif { NULL, NULL } }; diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c index 04fa106300..978a303f59 100644 --- a/src/mesa/tnl/t_draw.c +++ b/src/mesa/tnl/t_draw.c @@ -158,6 +158,18 @@ static void _tnl_import_array( GLcontext *ctx, case GL_DOUBLE: CONVERT(GLdouble, (GLfloat)); break; +#if FEATURE_fixedpt + case GL_FIXED: + { + GLuint i, j; + for (i = 0; i < count; i++) { + const GLint *in = (GLint *) (ptr + i * input->StrideB); + for (j = 0; j < sz; j++) + *fptr++ = *in++ / 65536.0f; + } + } + break; +#endif default: assert(0); break; |