#include "context.h"
#include "colormac.h"
+#include "fbobject.h"
#include "macros.h"
#include "texfetch.h"
+#include "teximage.h"
#include "texrender.h"
#include "renderbuffer.h"
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
* 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
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);
}
}
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);
}
}
*/
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);
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;
}
}
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);
}
}
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
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);
}
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);
}
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);
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;
}
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);
}
* 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
* 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
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
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)
{
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)
{
* 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;
_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;
(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);
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;
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;
* \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)
{
void
-_mesa_finish_render_texture(GLcontext *ctx,
+_mesa_finish_render_texture(struct gl_context *ctx,
struct gl_renderbuffer_attachment *att)
{
/* do nothing */