[Mesa-dev] [PATCH 7/8] meta: add _mesa_meta_DrawTex()
Ian Romanick
idr at freedesktop.org
Wed Aug 31 13:04:07 PDT 2011
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 08/30/2011 10:46 PM, Chia-I Wu wrote:
> From: Chia-I Wu <olv at lunarg.com>
>
> It can be used for dd->DrawTex.
My main concern about this is that we have exactly zero tests for this
extension. Before this is enabled in Intel drivers, I want there to be
at least some test coverage. I always have Keith Packard's adage, "Any
code that isn't tested is broken." in the back of my mind... and I hate
it when he's right. :)
There's one other comment below. I was going to say more, but I decided
I was wrong.
> ---
> src/mesa/drivers/common/meta.c | 141 ++++++++++++++++++++++++++++++++++++++++
> src/mesa/drivers/common/meta.h | 3 +
> 2 files changed, 144 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index 291d912..c772543 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -259,6 +259,17 @@ struct gen_mipmap_state
> GLuint FBO;
> };
>
> +
> +/**
> + * State for glDrawTex()
> + */
> +struct drawtex_state
> +{
> + GLuint ArrayObj;
> + GLuint VBO;
> +};
> +
> +
> #define MAX_META_OPS_DEPTH 2
> /**
> * All per-context meta state.
> @@ -278,6 +289,7 @@ struct gl_meta_state
> struct drawpix_state DrawPix; /**< For _mesa_meta_DrawPixels() */
> struct bitmap_state Bitmap; /**< For _mesa_meta_Bitmap() */
> struct gen_mipmap_state Mipmap; /**< For _mesa_meta_GenerateMipmap() */
> + struct drawtex_state DrawTex; /**< For _mesa_meta_DrawTex() */
> };
>
>
> @@ -2994,3 +3006,132 @@ _mesa_meta_CopyColorSubTable(struct gl_context *ctx,GLenum target, GLsizei start
>
> free(buf);
> }
> +
> +
> +/**
> + * Meta implementation of ctx->Driver.DrawTex() in terms
> + * of polygon rendering.
> + */
> +void
> +_mesa_meta_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
> + GLfloat width, GLfloat height)
> +{
> +#if FEATURE_OES_draw_texture
> + struct drawtex_state *drawtex = &ctx->Meta->DrawTex;
> + struct vertex {
> + GLfloat x, y, z, st[MAX_TEXTURE_UNITS][2];
> + };
> + struct vertex verts[4];
> + GLuint i;
> +
> + _mesa_meta_begin(ctx, (MESA_META_RASTERIZATION |
> + MESA_META_SHADER |
> + MESA_META_TRANSFORM |
> + MESA_META_VERTEX |
> + MESA_META_VIEWPORT));
> +
> + if (drawtex->ArrayObj == 0) {
> + /* one-time setup */
> + GLint active_texture;
> +
> + /* 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);
> +
> + /* client active texture is not part of the array object */
> + active_texture = ctx->Array.ActiveTexture;
> +
> + /* 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);
> + }
> +
> + /* restore client active texture */
> + _mesa_ClientActiveTextureARB(GL_TEXTURE0 + active_texture);
> + }
> + else {
> + _mesa_BindVertexArray(drawtex->ArrayObj);
> + _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, drawtex->VBO);
> + }
> +
> + /* vertex positions, texcoords */
> + {
> + const GLfloat x1 = x + width;
> + const GLfloat y1 = y + height;
> +
> + z = CLAMP(z, 0.0, 1.0);
> + z = invert_z(z);
> +
> + 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);
> +
> + _mesa_meta_end(ctx);
> +#else
The #else is unnecessary.
> +#endif /* FEATURE_OES_draw_texture */
> +}
> diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
> index ac20e37..b52687f 100644
> --- a/src/mesa/drivers/common/meta.h
> +++ b/src/mesa/drivers/common/meta.h
> @@ -140,5 +140,8 @@ _mesa_meta_CopyConvolutionFilter2D(struct gl_context *ctx, GLenum target,
> GLenum internalFormat, GLint x, GLint y,
> GLsizei width, GLsizei height);
>
> +extern void
> +_mesa_meta_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
> + GLfloat width, GLfloat height);
>
> #endif /* META_H */
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
iEYEARECAAYFAk5ek7YACgkQX1gOwKyEAw8a/ACdE65S0mS9hWfjusMuYzG/ug7p
CRQAn11HRq0TRvf5mMo+A7FJcqdArpIH
=CdOW
-----END PGP SIGNATURE-----
More information about the mesa-dev
mailing list