mesa/es: Add support for GL_OES_draw_texture.
authorChia-I Wu <olvaffe@gmail.com>
Tue, 22 Sep 2009 07:00:24 +0000 (15:00 +0800)
committerBrian Paul <brianp@vmware.com>
Fri, 6 Nov 2009 03:04:20 +0000 (20:04 -0700)
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
14 files changed:
src/mesa/es/main/APIspec.txt
src/mesa/es/main/drawtex.c [new file with mode: 0644]
src/mesa/es/main/drawtex.h [new file with mode: 0644]
src/mesa/es/main/mfeatures_es1.h
src/mesa/es/main/mfeatures_es2.h
src/mesa/es/main/specials_es1.c
src/mesa/es/sources.mak
src/mesa/es/state_tracker/st_cb_drawtex.c [new file with mode: 0644]
src/mesa/es/state_tracker/st_cb_drawtex.h [new file with mode: 0644]
src/mesa/main/dd.h
src/mesa/main/extensions.c
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_extensions.c

index 86dd546f634f62591d427ddda9aa67a20aaa1c38..6d18ae67d9f6157c117953d01409440fffee7026 100644 (file)
@@ -412,6 +412,8 @@ checkdependentparam pname GL_TEXTURE_WRAP_T params GLES1.1:GL_MIRRORED_REPEAT_OE
 dependentvector        params 1 pname  GL_TEXTURE_MAX_ANISOTROPY_EXT
 # OES_texture_3D
 checkdependentparam pname GL_TEXTURE_WRAP_R_OES params GLES2.0:GL_CLAMP_TO_EDGE GLES2.0:GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+# OES_draw_texture - not in gl2ext.h
+dependentvector        params 4 pname GLES1.1:GL_TEXTURE_CROP_RECT_OES
 category       GLES1.1 GLES2.0
 
 name           TexParameteri
@@ -457,6 +459,8 @@ checkdependentparam pname GL_TEXTURE_WRAP_T params GLES1.1:GL_MIRRORED_REPEAT_OE
 dependentvector params 1 pname  GL_TEXTURE_MAX_ANISOTROPY_EXT
 # OES_texture_3D
 checkdependentparam pname GL_TEXTURE_WRAP_R_OES params GLES2.0:GL_CLAMP_TO_EDGE GLES2.0:GL_REPEAT GLES2.0:GL_MIRRORED_REPEAT
+# OES_draw_texture - not in gl2ext.h
+dependentvector        params 4 pname GLES1.1:GL_TEXTURE_CROP_RECT_OES
 category       GLES1.1 GLES2.0
 
 name           TexParameterx
@@ -498,6 +502,8 @@ checkdependentparam pname GL_TEXTURE_MAG_FILTER params GL_NEAREST GL_LINEAR
 checkdependentparam pname GL_GENERATE_MIPMAP params GL_TRUE GL_FALSE
 convertalias   TexParameterfv
 convertparams   GLfloat         params
+# OES_draw_texture
+dependentvector        params 4 pname GL_TEXTURE_CROP_RECT_OES
 # OES_texture_cube_map
 checkparam      target          GL_TEXTURE_CUBE_MAP_OES
 # OES_texture_mirrored_repeat
@@ -1352,6 +1358,8 @@ param             pname           GLenum
 param          params          GLfloat *
 dependentvector params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GLES1.1:GL_GENERATE_MIPMAP
 props          get
+# OES_draw_texture - not in gl2ext.h
+dependentvector        params 4 pname  GLES1.1:GL_TEXTURE_CROP_RECT_OES
 # OES_texture_cube_map
 checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
 category       GLES1.1 GLES2.0
@@ -1366,6 +1374,8 @@ dependentvector params 1 pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_MI
 props          get
 # OES_texture_cube_map
 checkparam      target          GLES1.1:GL_TEXTURE_CUBE_MAP_OES
+# OES_draw_texture - not in gl2ext.h
+dependentvector        params 4 pname GLES1.1:GL_TEXTURE_CROP_RECT_OES
 # OES_texture_3D
 checkparam      target          GLES2.0:GL_TEXTURE_3D_OES
 category       GLES1.1 GLES2.0
@@ -1383,6 +1393,8 @@ dependentnovalueconvert params pname GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXT
 props          get
 # OES_texture_cube_map
 checkparam      target          GL_TEXTURE_CUBE_MAP_OES
+# OES_draw_texture
+dependentvector        params 4 pname GL_TEXTURE_CROP_RECT_OES
 category       GLES1.1 GLES1.1:OES_fixed_point
 
 # GLES1.1 and GLES2.0 have different capabilities
@@ -2867,6 +2879,71 @@ vector           exponent        16
 props           get
 category        GLES1.1:OES_query_matrix
 
+# OES_draw_texture
+name            DrawTexf
+return          void
+param           x               GLfloat
+param           y               GLfloat
+param           z               GLfloat
+param           w               GLfloat
+param           h               GLfloat
+category        GLES1.1:OES_draw_texture
+
+name            DrawTexi
+return          void
+param           x               GLint
+param           y               GLint
+param           z               GLint
+param           w               GLint
+param           h               GLint
+category        GLES1.1:OES_draw_texture
+
+name            DrawTexs
+return          void
+param           x               GLshort
+param           y               GLshort
+param           z               GLshort
+param           w               GLshort
+param           h               GLshort
+category        GLES1.1:OES_draw_texture
+
+name            DrawTexx
+return          void
+param           x               GLfixed
+param           y               GLfixed
+param           z               GLfixed
+param           w               GLfixed
+param           h               GLfixed
+convertalias    DrawTexf
+convertparams   GLfloat        x y z w h
+category        GLES1.1:OES_draw_texture
+
+name            DrawTexfv
+return          void
+param           coords          const GLfloat *
+vector          coords          5
+category        GLES1.1:OES_draw_texture
+
+name            DrawTexiv
+return          void
+param           coords          const GLint *
+vector          coords          5
+category        GLES1.1:OES_draw_texture
+
+name            DrawTexsv
+return          void
+param           coords          const GLshort *
+vector          coords          5
+category        GLES1.1:OES_draw_texture
+
+name            DrawTexxv
+return          void
+param           coords          const GLfixed *
+vector          coords          5
+convertalias    DrawTexfv
+convertparams   GLfloat         coords
+category        GLES1.1:OES_draw_texture
+
 # We don't support OES_get_program_binary yet either
 #name GetProgramBinary
 #return void
diff --git a/src/mesa/es/main/drawtex.c b/src/mesa/es/main/drawtex.c
new file mode 100644 (file)
index 0000000..cbd41ca
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2009 Chia-I Wu <olv@0xlab.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "drawtex.h"
+#include "main/state.h"
+#include "main/imports.h"
+
+#include "glapi/dispatch.h"
+
+
+#if FEATURE_OES_draw_texture
+
+
+static void
+draw_texture(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z,
+             GLfloat width, GLfloat height)
+{
+   if (!ctx->Extensions.OES_draw_texture) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glDrawTex(unsupported)");
+      return;
+   }
+   if (width <= 0.0f || height <= 0.0f) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glDrawTex(width or height <= 0)");
+      return;
+   }
+
+   if (ctx->NewState)
+      _mesa_update_state(ctx);
+
+   ASSERT(ctx->Driver.DrawTex);
+   ctx->Driver.DrawTex(ctx, x, y, z, width, height);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexf(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx, x, y, z, width, height);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexfv(const GLfloat *coords)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx, coords[0], coords[1], coords[2], coords[3], coords[4]);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexi(GLint x, GLint y, GLint z, GLint width, GLint height)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx, (GLfloat) x, (GLfloat) y, (GLfloat) z,
+                (GLfloat) width, (GLfloat) height);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexiv(const GLint *coords)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx, (GLfloat) coords[0], (GLfloat) coords[1],
+                (GLfloat) coords[2], (GLfloat) coords[3], (GLfloat) coords[4]);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexs(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx, (GLfloat) x, (GLfloat) y, (GLfloat) z,
+                (GLfloat) width, (GLfloat) height);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexsv(const GLshort *coords)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx, (GLfloat) coords[0], (GLfloat) coords[1],
+                (GLfloat) coords[2], (GLfloat) coords[3], (GLfloat) coords[4]);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexx(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx,
+                (GLfloat) x / 65536.0f,
+                (GLfloat) y / 65536.0f,
+                (GLfloat) z / 65536.0f,
+                (GLfloat) width / 65536.0f,
+                (GLfloat) height / 65536.0f);
+}
+
+
+void GLAPIENTRY
+_mesa_DrawTexxv(const GLfixed *coords)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   draw_texture(ctx,
+                (GLfloat) coords[0] / 65536.0f,
+                (GLfloat) coords[1] / 65536.0f,
+                (GLfloat) coords[2] / 65536.0f,
+                (GLfloat) coords[3] / 65536.0f,
+                (GLfloat) coords[4] / 65536.0f);
+}
+
+
+void
+_mesa_init_drawtex_dispatch(struct _glapi_table *disp)
+{
+   SET_DrawTexfOES(disp, _mesa_DrawTexf);
+   SET_DrawTexfvOES(disp, _mesa_DrawTexfv);
+   SET_DrawTexiOES(disp, _mesa_DrawTexi);
+   SET_DrawTexivOES(disp, _mesa_DrawTexiv);
+   SET_DrawTexsOES(disp, _mesa_DrawTexs);
+   SET_DrawTexsvOES(disp, _mesa_DrawTexsv);
+   SET_DrawTexxOES(disp, _mesa_DrawTexx);
+   SET_DrawTexxvOES(disp, _mesa_DrawTexxv);
+}
+
+
+#endif /* FEATURE_OES_draw_texture */
diff --git a/src/mesa/es/main/drawtex.h b/src/mesa/es/main/drawtex.h
new file mode 100644 (file)
index 0000000..0f3bac3
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2009 Chia-I Wu <olv@0xlab.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef DRAWTEX_H
+#define DRAWTEX_H
+
+
+#include "main/mtypes.h"
+
+
+#if FEATURE_OES_draw_texture
+
+#define _MESA_INIT_DRAWTEX_FUNCTIONS(driver, impl) \
+   do {                                            \
+      (driver)->DrawTex = impl ## DrawTex;         \
+   } while (0)
+
+extern void GLAPIENTRY
+_mesa_DrawTexf(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
+
+extern void GLAPIENTRY
+_mesa_DrawTexfv(const GLfloat *coords);
+
+extern void GLAPIENTRY
+_mesa_DrawTexi(GLint x, GLint y, GLint z, GLint width, GLint height);
+
+extern void GLAPIENTRY
+_mesa_DrawTexiv(const GLint *coords);
+
+extern void GLAPIENTRY
+_mesa_DrawTexs(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height);
+
+extern void GLAPIENTRY
+_mesa_DrawTexsv(const GLshort *coords);
+
+extern void GLAPIENTRY
+_mesa_DrawTexx(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height);
+
+extern void GLAPIENTRY
+_mesa_DrawTexxv(const GLfixed *coords);
+
+extern void
+_mesa_init_drawtex_dispatch(struct _glapi_table *disp);
+
+#else /* FEATURE_OES_draw_texture */
+
+#define _MESA_INIT_DRAWTEX_FUNCTIONS(driver, impl) do { } while (0)
+
+static INLINE void
+_mesa_init_drawtex_dispatch(struct _glapi_table *disp)
+{
+}
+
+#endif /* FEATURE_OES_draw_texture */
+
+
+#endif /* DRAWTEX_H */
index 9c655960893c5a1b4f5e55951a64e9efb7709bfd..6c2ece26080a7bb1f96fc90f3629b8bbfcdf7232 100644 (file)
 #define FEATURE_NV_vertex_program 0
 
 #define FEATURE_OES_framebuffer_object 1
+#define FEATURE_OES_draw_texture 1
 #define FEATURE_OES_mapbuffer 1
 
 #define FEATURE_extra_context_init 1
index 6ed7b678dcd18012341c3a03490563ddf3514811..f34782fedb95b670b52443e06b6a68631f238326 100644 (file)
 #define FEATURE_NV_vertex_program 0
 
 #define FEATURE_OES_framebuffer_object 1
+#define FEATURE_OES_draw_texture 0
 #define FEATURE_OES_mapbuffer 1
 
 #define FEATURE_extra_context_init 1
index 84d339ebf67c154a9b1726e5878d17338bafb8dc..548fb0f0297db3be45af0b43317632eeef9836a7 100644 (file)
@@ -100,6 +100,11 @@ make_extension_string(const GLcontext *ctx, char *str)
    /* 1.1 deprecated extensions */
    len += append_extension(&str, "GL_OES_query_matrix");
 
+#if FEATURE_OES_draw_texture
+   if (ctx->Extensions.OES_draw_texture)
+      len += append_extension(&str, "GL_OES_draw_texture");
+#endif
+
    if (ctx->Extensions.EXT_blend_equation_separate)
       len += append_extension(&str, "GL_OES_blend_equation_separate");
    if (ctx->Extensions.EXT_blend_func_separate)
index d12acaae8074f8ffa188c3e40085861323eb57b6..11f735d52af40b40867af9bdb214e32ec2ff23f1 100644 (file)
@@ -4,6 +4,7 @@ include $(MESA)/sources.mak
 
 LOCAL_ES1_SOURCES :=                   \
        main/api_exec_es1.c             \
+       main/drawtex.c                  \
        main/get_es1.c                  \
        main/specials_es1.c             \
        main/drawtex.c                  \
@@ -14,7 +15,8 @@ LOCAL_ES1_SOURCES :=                  \
        glapi/glapi-es1/main/enums.c
 
 LOCAL_ES1_GALLIUM_SOURCES :=           \
-       $(LOCAL_ES1_SOURCES)
+       $(LOCAL_ES1_SOURCES)            \
+       state_tracker/st_cb_drawtex.c
 
 # always use local version of GLAPI_ASM_SOURCES
 LOCAL_ES1_API_ASM := $(addprefix glapi/glapi-es1/, $(GLAPI_ASM_SOURCES))
diff --git a/src/mesa/es/state_tracker/st_cb_drawtex.c b/src/mesa/es/state_tracker/st_cb_drawtex.c
new file mode 100644 (file)
index 0000000..3b98b9c
--- /dev/null
@@ -0,0 +1,297 @@
+/**************************************************************************
+ * 
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ **************************************************************************/
+
+
+/**
+ * Implementation of glDrawTex() for GL_OES_draw_tex
+ */
+
+
+
+#include "main/imports.h"
+#include "main/image.h"
+#include "main/bufferobj.h"
+#include "main/drawtex.h"
+#include "main/macros.h"
+#include "main/state.h"
+#include "main/texformat.h"
+#include "shader/program.h"
+#include "shader/prog_parameter.h"
+#include "shader/prog_print.h"
+
+#include "st_context.h"
+#include "st_atom.h"
+#include "st_atom_constbuf.h"
+#include "st_draw.h"
+#include "st_cb_drawtex.h"
+
+#include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_inlines.h"
+#include "pipe/p_shader_tokens.h"
+#include "util/u_tile.h"
+#include "util/u_draw_quad.h"
+#include "util/u_simple_shaders.h"
+
+#include "cso_cache/cso_context.h"
+
+
+struct cached_shader
+{
+   //struct pipe_shader_state shader;
+   void *handle;
+
+   uint num_attribs;
+   uint semantic_names[2 + MAX_TEXTURE_UNITS];
+   uint semantic_indexes[2 + MAX_TEXTURE_UNITS];
+};
+
+#define MAX_SHADERS (2 * MAX_TEXTURE_UNITS)
+
+/**
+ * Simple linear list cache.
+ * Most of the time there'll only be one cached shader.
+ */
+static struct cached_shader CachedShaders[MAX_SHADERS];
+static GLuint NumCachedShaders = 0;
+
+
+#if FEATURE_OES_draw_texture
+
+
+static void *
+lookup_shader(struct pipe_context *pipe,
+              uint num_attribs,
+              const uint *semantic_names,
+              const uint *semantic_indexes)
+{
+   GLuint i, j;
+
+   /* look for existing shader with same attributes */
+   for (i = 0; i < NumCachedShaders; i++) {
+      if (CachedShaders[i].num_attribs == num_attribs) {
+         GLboolean match = GL_TRUE;
+         for (j = 0; j < num_attribs; j++) {
+            if (semantic_names[j] != CachedShaders[i].semantic_names[j] ||
+                semantic_indexes[j] != CachedShaders[i].semantic_indexes[j]) {
+               match = GL_FALSE;
+               break;
+            }
+         }
+         if (match)
+            return CachedShaders[i].handle;
+      }
+   }
+
+   /* not found - create new one now */
+   if (NumCachedShaders >= MAX_SHADERS) {
+      return NULL;
+   }
+
+   CachedShaders[i].num_attribs = num_attribs;
+   for (j = 0; j < num_attribs; j++) {
+      CachedShaders[i].semantic_names[j] = semantic_names[j];
+      CachedShaders[i].semantic_indexes[j] = semantic_indexes[j];
+   }
+
+   CachedShaders[i].handle =
+      util_make_vertex_passthrough_shader(pipe,
+                                          num_attribs,
+                                          semantic_names,
+                                          semantic_indexes);
+   NumCachedShaders++;
+
+   return CachedShaders[i].handle;
+}
+
+static void
+st_DrawTex(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z,
+           GLfloat width, GLfloat height)
+{
+   struct st_context *st = ctx->st;
+   struct pipe_context *pipe = st->pipe;
+   struct cso_context *cso = ctx->st->cso_context;
+   struct pipe_buffer *vbuffer;
+   GLuint i, numTexCoords, numAttribs;
+   GLboolean emitColor;
+   uint semantic_names[2 + MAX_TEXTURE_UNITS];
+   uint semantic_indexes[2 + MAX_TEXTURE_UNITS];
+   GLbitfield inputs = VERT_BIT_POS;
+
+   /* determine if we need vertex color */
+   if (ctx->FragmentProgram._Current->Base.InputsRead & FRAG_BIT_COL0)
+      emitColor = GL_TRUE;
+   else
+      emitColor = GL_FALSE;
+
+   /* determine how many enabled sets of texcoords */
+   numTexCoords = 0;
+   for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
+      if (ctx->Texture.Unit[i]._ReallyEnabled & TEXTURE_2D_BIT) {
+         inputs |= VERT_BIT_TEX(i);
+         numTexCoords++;
+      }
+   }
+
+   /* total number of attributes per vertex */
+   numAttribs = 1 + emitColor + numTexCoords;
+
+
+   /* create the vertex buffer */
+   vbuffer = pipe_buffer_create(pipe->screen, 32, PIPE_BUFFER_USAGE_VERTEX,
+                                numAttribs * 4 * 4 * sizeof(GLfloat));
+
+   /* load vertex buffer */
+   {
+#define SET_ATTRIB(VERT, ATTR, X, Y, Z, W)                              \
+      do {                                                              \
+         GLuint k = (((VERT) * numAttribs + (ATTR)) * 4);               \
+         assert(k < 4 * 4 * numAttribs);                                \
+         vbuf[k + 0] = X;                                               \
+         vbuf[k + 1] = Y;                                               \
+         vbuf[k + 2] = Z;                                               \
+         vbuf[k + 3] = W;                                               \
+      } while (0)
+
+      const GLfloat x0 = x, y0 = y, x1 = x + width, y1 = y + height;
+      GLfloat *vbuf = (GLfloat *) pipe_buffer_map(pipe->screen, vbuffer,
+                                                  PIPE_BUFFER_USAGE_CPU_WRITE);
+      GLuint attr;
+      
+      z = CLAMP(z, 0.0f, 1.0f);
+
+      /* positions (in clip coords) */
+      {
+         const struct gl_framebuffer *fb = st->ctx->DrawBuffer;
+         const GLfloat fb_width = (GLfloat)fb->Width;
+         const GLfloat fb_height = (GLfloat)fb->Height;
+
+         const GLfloat clip_x0 = (GLfloat)(x0 / fb_width * 2.0 - 1.0);
+         const GLfloat clip_y0 = (GLfloat)(y0 / fb_height * 2.0 - 1.0);
+         const GLfloat clip_x1 = (GLfloat)(x1 / fb_width * 2.0 - 1.0);
+         const GLfloat clip_y1 = (GLfloat)(y1 / fb_height * 2.0 - 1.0);
+
+         SET_ATTRIB(0, 0, clip_x0, clip_y0, z, 1.0f);   /* lower left */
+         SET_ATTRIB(1, 0, clip_x1, clip_y0, z, 1.0f);   /* lower right */
+         SET_ATTRIB(2, 0, clip_x1, clip_y1, z, 1.0f);   /* upper right */
+         SET_ATTRIB(3, 0, clip_x0, clip_y1, z, 1.0f);   /* upper left */
+
+         semantic_names[0] = TGSI_SEMANTIC_POSITION;
+         semantic_indexes[0] = 0;
+      }
+
+      /* colors */
+      if (emitColor) {
+         const GLfloat *c = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
+         SET_ATTRIB(0, 1, c[0], c[1], c[2], c[3]);
+         SET_ATTRIB(1, 1, c[0], c[1], c[2], c[3]);
+         SET_ATTRIB(2, 1, c[0], c[1], c[2], c[3]);
+         SET_ATTRIB(3, 1, c[0], c[1], c[2], c[3]);
+         semantic_names[1] = TGSI_SEMANTIC_COLOR;
+         semantic_indexes[1] = 0;
+         attr = 2;
+      }
+      else {
+         attr = 1;
+      }
+
+      /* texcoords */
+      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
+         if (ctx->Texture.Unit[i]._ReallyEnabled & TEXTURE_2D_BIT) {
+            struct gl_texture_object *obj = ctx->Texture.Unit[i]._Current;
+            struct gl_texture_image *img = obj->Image[0][obj->BaseLevel];
+            const GLfloat wt = (GLfloat) img->Width;
+            const GLfloat ht = (GLfloat) img->Height;
+            const GLfloat s0 = obj->CropRect[0] / wt;
+            const GLfloat t0 = obj->CropRect[1] / ht;
+            const GLfloat s1 = (obj->CropRect[0] + obj->CropRect[2]) / wt;
+            const GLfloat t1 = (obj->CropRect[1] + obj->CropRect[3]) / ht;
+
+            /*printf("crop texcoords: %g, %g .. %g, %g\n", s0, t0, s1, t1);*/
+            SET_ATTRIB(0, attr, s0, t0, 0.0f, 1.0f);  /* lower left */
+            SET_ATTRIB(1, attr, s1, t0, 0.0f, 1.0f);  /* lower right */
+            SET_ATTRIB(2, attr, s1, t1, 0.0f, 1.0f);  /* upper right */
+            SET_ATTRIB(3, attr, s0, t1, 0.0f, 1.0f);  /* upper left */
+
+            semantic_names[attr] = TGSI_SEMANTIC_GENERIC;
+            semantic_indexes[attr] = 0;
+
+            attr++;
+         }
+      }
+
+      pipe_buffer_unmap(pipe->screen, vbuffer);
+
+#undef SET_ATTRIB
+   }
+
+
+   cso_save_viewport(cso);
+   cso_save_vertex_shader(cso);
+
+   {
+      void *vs = lookup_shader(pipe, numAttribs,
+                               semantic_names, semantic_indexes);
+      cso_set_vertex_shader_handle(cso, vs);
+   }
+
+   /* viewport state: viewport matching window dims */
+   {
+      const struct gl_framebuffer *fb = st->ctx->DrawBuffer;
+      const GLboolean invert = (st_fb_orientation(fb) == Y_0_TOP);
+      const GLfloat width = (GLfloat)fb->Width;
+      const GLfloat height = (GLfloat)fb->Height;
+      struct pipe_viewport_state vp;
+      vp.scale[0] =  0.5f * width;
+      vp.scale[1] = height * (invert ? -0.5f : 0.5f);
+      vp.scale[2] = 1.0f;
+      vp.scale[3] = 1.0f;
+      vp.translate[0] = 0.5f * width;
+      vp.translate[1] = 0.5f * height;
+      vp.translate[2] = 0.0f;
+      vp.translate[3] = 0.0f;
+      cso_set_viewport(cso, &vp);
+   }
+
+
+   util_draw_vertex_buffer(pipe, vbuffer,
+                           0,  /* offset */
+                           PIPE_PRIM_TRIANGLE_FAN,
+                           4,  /* verts */
+                           numAttribs); /* attribs/vert */
+
+
+   pipe_buffer_reference(&vbuffer, NULL);
+
+   /* restore state */
+   cso_restore_viewport(cso);
+   cso_restore_vertex_shader(cso);
+}
+
+
+#endif /* FEATURE_OES_draw_texture */
+
+
+void
+st_init_drawtex_functions(struct dd_function_table *functions)
+{
+   _MESA_INIT_DRAWTEX_FUNCTIONS(functions, st_);
+}
+
+
+/**
+ * Free any cached shaders
+ */
+void
+st_destroy_drawtex(struct st_context *st)
+{
+   GLuint i;
+   for (i = 0; i < NumCachedShaders; i++) {
+      cso_delete_vertex_shader(st->cso_context, CachedShaders[i].handle);
+   }
+   NumCachedShaders = 0;
+}
diff --git a/src/mesa/es/state_tracker/st_cb_drawtex.h b/src/mesa/es/state_tracker/st_cb_drawtex.h
new file mode 100644 (file)
index 0000000..7b0da70
--- /dev/null
@@ -0,0 +1,18 @@
+/**************************************************************************
+ * 
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ **************************************************************************/
+
+
+#ifndef ST_CB_DRAWTEX_H
+#define ST_CB_DRAWTEX_H
+
+extern void
+st_init_drawtex_functions(struct dd_function_table *functions);
+
+extern void
+st_destroy_drawtex(struct st_context *st);
+
+#endif /* ST_CB_DRAWTEX_H */
index 99f2cad4028b5a35ffaabee2a02243c60b1f4c27..0488a693b2b06054d414c8488c16ee5ec3407b84 100644 (file)
@@ -1046,6 +1046,16 @@ struct dd_function_table {
                          GLbitfield, GLuint64);
    /*@}*/
 #endif
+
+#if FEATURE_OES_draw_texture
+   /**
+    * \name GL_OES_draw_texture interface
+    */
+   /*@{*/
+   void (*DrawTex)(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z,
+                   GLfloat width, GLfloat height);
+   /*@}*/
+#endif
 };
 
 
index 54cf37c5f48f6b79ca19278dc3154314480fbed5..7a8184ffc8987916909db269797fcd2ffabd4a7d 100644 (file)
@@ -185,6 +185,9 @@ static const struct {
    { ON,  "GL_SGIS_texture_lod",               F(SGIS_texture_lod) },
    { ON,  "GL_SUN_multi_draw_arrays",          F(EXT_multi_draw_arrays) },
    { OFF, "GL_S3_s3tc",                        F(S3_s3tc) },
+#if FEATURE_OES_draw_texture
+   { OFF, "GL_OES_draw_texture",               F(OES_draw_texture) },
+#endif /* FEATURE_OES_draw_texture */
 };
 
 
index 94d29a7dbb69f88a0c2e0ff2b10eff2f1ad048b4..e91c7e5ac16d18bff4d1a3e1a8f3e4592552e422 100644 (file)
@@ -2485,6 +2485,9 @@ struct gl_extensions
    GLboolean SGIS_texture_lod;
    GLboolean TDFX_texture_compression_FXT1;
    GLboolean S3_s3tc;
+#if FEATURE_OES_draw_texture
+   GLboolean OES_draw_texture;
+#endif /* FEATURE_OES_draw_texture */
    /** The extension string */
    const GLubyte *String;
 };
index f0eddafd331dc127b4c7e259d0898e79641b6e1a..e82598c8e7e0b2b4c62873d03dc5bab911859c7f 100644 (file)
@@ -47,7 +47,7 @@
 #include "st_cb_drawpixels.h"
 #include "st_cb_rasterpos.h"
 #endif
-#ifdef FEATURE_OES_draw_texture
+#if FEATURE_OES_draw_texture
 #include "st_cb_drawtex.h"
 #endif
 #include "st_cb_fbo.h"
@@ -209,7 +209,7 @@ static void st_destroy_context_priv( struct st_context *st )
    st_destroy_bitmap(st);
    st_destroy_drawpix(st);
 #endif
-#ifdef FEATURE_OES_draw_texture
+#if FEATURE_OES_draw_texture
    st_destroy_drawtex(st);
 #endif
 
@@ -330,6 +330,11 @@ void st_init_driver_functions(struct dd_function_table *functions)
    st_init_drawpixels_functions(functions);
    st_init_rasterpos_functions(functions);
 #endif
+
+#if FEATURE_OES_draw_texture
+   st_init_drawtex_functions(functions);
+#endif
+
    st_init_fbo_functions(functions);
    st_init_get_functions(functions);
 #if FEATURE_feedback
index 3f835d38dd5138624b4e2902de324d1d86289c20..ce3c302e48e11bf1077a6c3be836ce03a3e0b38c 100644 (file)
@@ -183,6 +183,10 @@ void st_init_extensions(struct st_context *st)
    ctx->Extensions.NV_texgen_reflection = GL_TRUE;
    ctx->Extensions.NV_texture_env_combine4 = GL_TRUE;
 
+#if FEATURE_OES_draw_texture
+   ctx->Extensions.OES_draw_texture = GL_TRUE;
+#endif
+
    ctx->Extensions.SGI_color_matrix = GL_TRUE;
    ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;