softpipe: use the polygon stipple utility module
[mesa.git] / src / mesa / main / texrender.c
index c68105b3951909701065e17c07beea75a9200996..a7641a5f9a49b69f66e0af5953cfdf093c6cab26 100644 (file)
@@ -1,8 +1,10 @@
 
 #include "context.h"
 #include "colormac.h"
+#include "fbobject.h"
 #include "macros.h"
 #include "texfetch.h"
+#include "teximage.h"
 #include "texrender.h"
 #include "renderbuffer.h"
 
@@ -20,6 +22,7 @@ struct texture_renderbuffer
    struct gl_renderbuffer Base;   /**< Base class object */
    struct gl_texture_image *TexImage;
    StoreTexelFunc Store;
+   FetchTexelFuncF Fetchf;
    GLint Yoffset;                 /**< Layer for 1D array textures. */
    GLint Zoffset;                 /**< Layer for 2D array textures, or slice
                                   * for 3D textures
@@ -31,7 +34,7 @@ struct texture_renderbuffer
  * Get row of values from the renderbuffer that wraps a texture image.
  */
 static void
-texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
+texture_get_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
                 GLint x, GLint y, void *values)
 {
    const struct texture_renderbuffer *trb
@@ -48,7 +51,7 @@ texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLchan *rgbaOut = (GLchan *) values;
       for (i = 0; i < count; i++) {
          GLfloat rgba[4];
-         trb->TexImage->FetchTexelf(trb->TexImage, x + i, y, z, rgba);
+         trb->Fetchf(trb->TexImage, x + i, y, z, rgba);
          UNCLAMPED_FLOAT_TO_RGBA_CHAN(rgbaOut + 4 * i, rgba);
       }
    }
@@ -56,7 +59,7 @@ texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLushort *zValues = (GLushort *) values;
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x + i, y, z, &flt);
+         trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
          zValues[i] = (GLushort) (flt * 0xffff);
       }
    }
@@ -67,7 +70,7 @@ texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       */
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x + i, y, z, &flt);
+         trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
 #if 0
          /* this should work, but doesn't (overflow due to low precision) */
          zValues[i] = (GLuint) (flt * scale);
@@ -81,7 +84,7 @@ texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLuint *zValues = (GLuint *) values;
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x + i, y, z, &flt);
+         trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
          zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
       }
    }
@@ -89,7 +92,7 @@ texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLuint *zValues = (GLuint *) values;
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x + i, y, z, &flt);
+         trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
          zValues[i] = (GLuint) (flt * 0xffffff);
       }
    }
@@ -100,7 +103,7 @@ texture_get_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
 
 
 static void
-texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
+texture_get_values(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
                    const GLint x[], const GLint y[], void *values)
 {
    const struct texture_renderbuffer *trb
@@ -112,7 +115,7 @@ texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLchan *rgbaOut = (GLchan *) values;
       for (i = 0; i < count; i++) {
          GLfloat rgba[4];
-         trb->TexImage->FetchTexelf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+         trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
                                    z, rgba);
          UNCLAMPED_FLOAT_TO_RGBA_CHAN(rgbaOut + 4 * i, rgba);
       }
@@ -121,7 +124,7 @@ texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLushort *zValues = (GLushort *) values;
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+         trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
                                    z, &flt);
          zValues[i] = (GLushort) (flt * 0xffff);
       }
@@ -130,7 +133,7 @@ texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLuint *zValues = (GLuint *) values;
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+         trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
                                    z, &flt);
 #if 0
          zValues[i] = (GLuint) (flt * 0xffffffff);
@@ -143,7 +146,7 @@ texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLuint *zValues = (GLuint *) values;
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+         trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
                                    z, &flt);
          zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
       }
@@ -152,7 +155,7 @@ texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
       GLuint *zValues = (GLuint *) values;
       for (i = 0; i < count; i++) {
          GLfloat flt;
-         trb->TexImage->FetchTexelf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+         trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
                                    z, &flt);
          zValues[i] = (GLuint) (flt * 0xffffff);
       }
@@ -167,7 +170,7 @@ texture_get_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
  * Put row of values into a renderbuffer that wraps a texture image.
  */
 static void
-texture_put_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
+texture_put_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
                 GLint x, GLint y, const void *values, const GLubyte *mask)
 {
    const struct texture_renderbuffer *trb
@@ -229,7 +232,7 @@ texture_put_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
  * Put row of RGB values into a renderbuffer that wraps a texture image.
  */
 static void
-texture_put_row_rgb(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
+texture_put_row_rgb(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
                 GLint x, GLint y, const void *values, const GLubyte *mask)
 {
    const struct texture_renderbuffer *trb
@@ -289,7 +292,7 @@ texture_put_row_rgb(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
 
 
 static void
-texture_put_mono_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
+texture_put_mono_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
                      GLint x, GLint y, const void *value, const GLubyte *mask)
 {
    const struct texture_renderbuffer *trb
@@ -348,7 +351,7 @@ texture_put_mono_row(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
 
 
 static void
-texture_put_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
+texture_put_values(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
                    const GLint x[], const GLint y[], const void *values,
                    const GLubyte *mask)
 {
@@ -407,7 +410,7 @@ texture_put_values(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
 
 
 static void
-texture_put_mono_values(GLcontext *ctx, struct gl_renderbuffer *rb,
+texture_put_mono_values(struct gl_context *ctx, struct gl_renderbuffer *rb,
                         GLuint count, const GLint x[], const GLint y[],
                         const void *value, const GLubyte *mask)
 {
@@ -486,7 +489,7 @@ delete_texture_wrapper(struct gl_renderbuffer *rb)
  * This allows rendering into the texture as if it were a renderbuffer.
  */
 static void
-wrap_texture(GLcontext *ctx, struct gl_renderbuffer_attachment *att)
+wrap_texture(struct gl_context *ctx, struct gl_renderbuffer_attachment *att)
 {
    struct texture_renderbuffer *trb;
    const GLuint name = 0;
@@ -517,15 +520,13 @@ wrap_texture(GLcontext *ctx, struct gl_renderbuffer_attachment *att)
    _mesa_reference_renderbuffer(&att->Renderbuffer, &(trb->Base));
 }
 
-
-
 /**
  * Update the renderbuffer wrapper for rendering to a texture.
  * For example, update the width, height of the RB based on the texture size,
  * update the internal format info, etc.
  */
 static void
-update_wrapper(GLcontext *ctx, const struct gl_renderbuffer_attachment *att)
+update_wrapper(struct gl_context *ctx, struct gl_renderbuffer_attachment *att)
 {
    struct texture_renderbuffer *trb
       = (struct texture_renderbuffer *) att->Renderbuffer;
@@ -533,7 +534,7 @@ update_wrapper(GLcontext *ctx, const struct gl_renderbuffer_attachment *att)
    (void) ctx;
    ASSERT(trb);
 
-   trb->TexImage = att->Texture->Image[att->CubeMapFace][att->TextureLevel];
+   trb->TexImage = _mesa_get_attachment_teximage(att);
    ASSERT(trb->TexImage);
 
    trb->Store = _mesa_get_texel_store_func(trb->TexImage->TexFormat);
@@ -542,6 +543,8 @@ update_wrapper(GLcontext *ctx, const struct gl_renderbuffer_attachment *att)
       trb->Store = store_nop;
    }
 
+   trb->Fetchf = trb->TexImage->FetchTexelf;
+
    if (att->Texture->Target == GL_TEXTURE_1D_ARRAY_EXT) {
       trb->Yoffset = att->Zoffset;
       trb->Zoffset = 0;
@@ -582,6 +585,22 @@ update_wrapper(GLcontext *ctx, const struct gl_renderbuffer_attachment *att)
       trb->Base.DataType = GL_UNSIGNED_INT;
       trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
       break;
+   /* SRGB formats pre EXT_framebuffer_sRGB don't do sRGB translations on FBO readback */
+   case MESA_FORMAT_SRGB8:
+      trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_RGB888, _mesa_get_texture_dimensions(att->Texture->Target));
+      trb->Base.DataType = CHAN_TYPE;
+      trb->Base._BaseFormat = GL_RGBA;
+      break;
+   case MESA_FORMAT_SRGBA8:
+      trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_RGBA8888, _mesa_get_texture_dimensions(att->Texture->Target));
+      trb->Base.DataType = CHAN_TYPE;
+      trb->Base._BaseFormat = GL_RGBA;
+      break;
+   case MESA_FORMAT_SARGB8:
+      trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_ARGB8888, _mesa_get_texture_dimensions(att->Texture->Target));
+      trb->Base.DataType = CHAN_TYPE;
+      trb->Base._BaseFormat = GL_RGBA;
+      break;
    default:
       trb->Base.DataType = CHAN_TYPE;
       trb->Base._BaseFormat = GL_RGBA;
@@ -609,7 +628,7 @@ update_wrapper(GLcontext *ctx, const struct gl_renderbuffer_attachment *att)
  * \sa _mesa_framebuffer_renderbuffer
  */
 void
-_mesa_render_texture(GLcontext *ctx,
+_mesa_render_texture(struct gl_context *ctx,
                      struct gl_framebuffer *fb,
                      struct gl_renderbuffer_attachment *att)
 {
@@ -623,7 +642,7 @@ _mesa_render_texture(GLcontext *ctx,
 
 
 void
-_mesa_finish_render_texture(GLcontext *ctx,
+_mesa_finish_render_texture(struct gl_context *ctx,
                             struct gl_renderbuffer_attachment *att)
 {
    /* do nothing */