The assertion is that the correct read type to be using is the native type of the underlying read renderbuffer. For some fallback paths, this may be worse than GL_RGBA/GL_UNSIGNED_BYTE for reads today, but it gets all drivers the expected GL_BGRA/GL_UNSIGNED_BYTE for ARGB8888 or GL_BGR//GL_UNSIGNED_SHORT_5_6_5_REV for rgb565 with no work. This fixes the intel (and other) DRI drivers to report read formats that should hit blit PBO readpixels paths.tags/mesa-7.7-rc2-1
@@ -564,10 +564,6 @@ _mesa_init_constants(GLcontext *ctx) | |||
/* GL_ARB_draw_buffers */ | |||
ctx->Const.MaxDrawBuffers = MAX_DRAW_BUFFERS; | |||
/* GL_OES_read_format */ | |||
ctx->Const.ColorReadFormat = GL_RGBA; | |||
ctx->Const.ColorReadType = GL_UNSIGNED_BYTE; | |||
#if FEATURE_EXT_framebuffer_object | |||
ctx->Const.MaxColorAttachments = MAX_COLOR_ATTACHMENTS; | |||
ctx->Const.MaxRenderbufferSize = MAX_WIDTH; |
@@ -969,3 +969,29 @@ _mesa_dest_buffer_exists(GLcontext *ctx, GLenum format) | |||
/* OK */ | |||
return GL_TRUE; | |||
} | |||
GLenum | |||
_mesa_get_color_read_format(GLcontext *ctx) | |||
{ | |||
switch (ctx->ReadBuffer->_ColorReadBuffer->Format) { | |||
case MESA_FORMAT_ARGB8888: | |||
return GL_BGRA; | |||
case MESA_FORMAT_RGB565: | |||
return GL_BGR; | |||
default: | |||
return GL_RGBA; | |||
} | |||
} | |||
GLenum | |||
_mesa_get_color_read_type(GLcontext *ctx) | |||
{ | |||
switch (ctx->ReadBuffer->_ColorReadBuffer->Format) { | |||
case MESA_FORMAT_ARGB8888: | |||
return GL_UNSIGNED_BYTE; | |||
case MESA_FORMAT_RGB565: | |||
return GL_UNSIGNED_SHORT_5_6_5_REV; | |||
default: | |||
return GL_UNSIGNED_BYTE; | |||
} | |||
} |
@@ -81,5 +81,10 @@ _mesa_source_buffer_exists(GLcontext *ctx, GLenum format); | |||
extern GLboolean | |||
_mesa_dest_buffer_exists(GLcontext *ctx, GLenum format); | |||
extern GLenum | |||
_mesa_get_color_read_type(GLcontext *ctx); | |||
extern GLenum | |||
_mesa_get_color_read_format(GLcontext *ctx); | |||
#endif /* FRAMEBUFFER_H */ |
@@ -13,6 +13,7 @@ | |||
#include "mtypes.h" | |||
#include "state.h" | |||
#include "texcompress.h" | |||
#include "framebuffer.h" | |||
#define FLOAT_TO_BOOLEAN(X) ( (X) ? GL_TRUE : GL_FALSE ) | |||
@@ -1767,11 +1768,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params ) | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: | |||
CHECK_EXT1(OES_read_format, "GetBooleanv"); | |||
params[0] = INT_TO_BOOLEAN(ctx->Const.ColorReadType); | |||
params[0] = INT_TO_BOOLEAN(_mesa_get_color_read_type(ctx)); | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: | |||
CHECK_EXT1(OES_read_format, "GetBooleanv"); | |||
params[0] = INT_TO_BOOLEAN(ctx->Const.ColorReadFormat); | |||
params[0] = INT_TO_BOOLEAN(_mesa_get_color_read_format(ctx)); | |||
break; | |||
case GL_NUM_FRAGMENT_REGISTERS_ATI: | |||
CHECK_EXT1(ATI_fragment_shader, "GetBooleanv"); | |||
@@ -3602,11 +3603,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params ) | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: | |||
CHECK_EXT1(OES_read_format, "GetFloatv"); | |||
params[0] = (GLfloat)(ctx->Const.ColorReadType); | |||
params[0] = (GLfloat)(_mesa_get_color_read_type(ctx)); | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: | |||
CHECK_EXT1(OES_read_format, "GetFloatv"); | |||
params[0] = (GLfloat)(ctx->Const.ColorReadFormat); | |||
params[0] = (GLfloat)(_mesa_get_color_read_format(ctx)); | |||
break; | |||
case GL_NUM_FRAGMENT_REGISTERS_ATI: | |||
CHECK_EXT1(ATI_fragment_shader, "GetFloatv"); | |||
@@ -5437,11 +5438,11 @@ _mesa_GetIntegerv( GLenum pname, GLint *params ) | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: | |||
CHECK_EXT1(OES_read_format, "GetIntegerv"); | |||
params[0] = ctx->Const.ColorReadType; | |||
params[0] = _mesa_get_color_read_type(ctx); | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: | |||
CHECK_EXT1(OES_read_format, "GetIntegerv"); | |||
params[0] = ctx->Const.ColorReadFormat; | |||
params[0] = _mesa_get_color_read_format(ctx); | |||
break; | |||
case GL_NUM_FRAGMENT_REGISTERS_ATI: | |||
CHECK_EXT1(ATI_fragment_shader, "GetIntegerv"); | |||
@@ -7273,11 +7274,11 @@ _mesa_GetInteger64v( GLenum pname, GLint64 *params ) | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: | |||
CHECK_EXT1(OES_read_format, "GetInteger64v"); | |||
params[0] = (GLint64)(ctx->Const.ColorReadType); | |||
params[0] = (GLint64)(_mesa_get_color_read_type(ctx)); | |||
break; | |||
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: | |||
CHECK_EXT1(OES_read_format, "GetInteger64v"); | |||
params[0] = (GLint64)(ctx->Const.ColorReadFormat); | |||
params[0] = (GLint64)(_mesa_get_color_read_format(ctx)); | |||
break; | |||
case GL_NUM_FRAGMENT_REGISTERS_ATI: | |||
CHECK_EXT1(ATI_fragment_shader, "GetInteger64v"); |
@@ -942,9 +942,9 @@ StateVars = [ | |||
# GL_OES_read_format | |||
( "GL_IMPLEMENTATION_COLOR_READ_TYPE_OES", GLint, | |||
["ctx->Const.ColorReadType"], "", ["OES_read_format"] ), | |||
["_mesa_get_color_read_type(ctx)"], "", ["OES_read_format"] ), | |||
( "GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES", GLint, | |||
["ctx->Const.ColorReadFormat"], "", ["OES_read_format"] ), | |||
["_mesa_get_color_read_format(ctx)"], "", ["OES_read_format"] ), | |||
# GL_ATI_fragment_shader | |||
( "GL_NUM_FRAGMENT_REGISTERS_ATI", GLint, ["6"], "", ["ATI_fragment_shader"] ), | |||
@@ -1159,6 +1159,7 @@ def EmitHeader(): | |||
#include "mtypes.h" | |||
#include "state.h" | |||
#include "texcompress.h" | |||
#include "framebuffer.h" | |||
#define FLOAT_TO_BOOLEAN(X) ( (X) ? GL_TRUE : GL_FALSE ) |
@@ -2355,9 +2355,6 @@ struct gl_constants | |||
GLuint MaxDrawBuffers; /**< GL_ARB_draw_buffers */ | |||
GLenum ColorReadFormat; /**< GL_OES_read_format */ | |||
GLenum ColorReadType; /**< GL_OES_read_format */ | |||
GLuint MaxColorAttachments; /**< GL_EXT_framebuffer_object */ | |||
GLuint MaxRenderbufferSize; /**< GL_EXT_framebuffer_object */ | |||
GLuint MaxSamples; /**< GL_ARB_framebuffer_object */ |
@@ -191,7 +191,6 @@ STATETRACKER_SOURCES = \ | |||
state_tracker/st_cb_bufferobjects.c \ | |||
state_tracker/st_cb_clear.c \ | |||
state_tracker/st_cb_flush.c \ | |||
state_tracker/st_cb_get.c \ | |||
state_tracker/st_cb_drawpixels.c \ | |||
state_tracker/st_cb_fbo.c \ | |||
state_tracker/st_cb_feedback.c \ |
@@ -1,97 +0,0 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. | |||
* All Rights Reserved. | |||
* | |||
* 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, sub license, 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 NON-INFRINGEMENT. | |||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS 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. | |||
* | |||
**************************************************************************/ | |||
/** | |||
* glGet functions | |||
* | |||
* \author Brian Paul | |||
*/ | |||
#include "main/imports.h" | |||
#include "main/context.h" | |||
#include "pipe/p_defines.h" | |||
#include "st_cb_fbo.h" | |||
#include "st_cb_get.h" | |||
/** | |||
* Examine the current color read buffer format to determine | |||
* which GL pixel format/type combo is the best match. | |||
*/ | |||
static void | |||
get_preferred_read_format_type(GLcontext *ctx, GLint *format, GLint *type) | |||
{ | |||
struct gl_framebuffer *fb = ctx->ReadBuffer; | |||
struct st_renderbuffer *strb = st_renderbuffer(fb->_ColorReadBuffer); | |||
/* defaults */ | |||
*format = ctx->Const.ColorReadFormat; | |||
*type = ctx->Const.ColorReadType; | |||
if (strb) { | |||
/* XXX could add more cases here... */ | |||
if (strb->format == PIPE_FORMAT_A8R8G8B8_UNORM) { | |||
*format = GL_BGRA; | |||
if (_mesa_little_endian()) | |||
*type = GL_UNSIGNED_INT_8_8_8_8_REV; | |||
else | |||
*type = GL_UNSIGNED_INT_8_8_8_8; | |||
} | |||
} | |||
} | |||
/** | |||
* We only intercept the OES preferred ReadPixels format/type. | |||
* Everything else goes to the default _mesa_GetIntegerv. | |||
*/ | |||
static GLboolean | |||
st_GetIntegerv(GLcontext *ctx, GLenum pname, GLint *params) | |||
{ | |||
GLint dummy; | |||
switch (pname) { | |||
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: | |||
get_preferred_read_format_type(ctx, &dummy, params); | |||
return GL_TRUE; | |||
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: | |||
get_preferred_read_format_type(ctx, params, &dummy); | |||
return GL_TRUE; | |||
default: | |||
return GL_FALSE; | |||
} | |||
} | |||
void st_init_get_functions(struct dd_function_table *functions) | |||
{ | |||
functions->GetIntegerv = st_GetIntegerv; | |||
} |
@@ -1,37 +0,0 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. | |||
* All Rights Reserved. | |||
* | |||
* 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, sub license, 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 NON-INFRINGEMENT. | |||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS 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 ST_CB_GET_H | |||
#define ST_CB_GET_H | |||
extern void | |||
st_init_get_functions(struct dd_function_table *functions); | |||
#endif |
@@ -51,7 +51,6 @@ | |||
#include "st_cb_drawtex.h" | |||
#endif | |||
#include "st_cb_fbo.h" | |||
#include "st_cb_get.h" | |||
#if FEATURE_feedback | |||
#include "st_cb_feedback.h" | |||
#endif | |||
@@ -331,7 +330,6 @@ void st_init_driver_functions(struct dd_function_table *functions) | |||
st_init_rasterpos_functions(functions); | |||
#endif | |||
st_init_fbo_functions(functions); | |||
st_init_get_functions(functions); | |||
#if FEATURE_feedback | |||
st_init_feedback_functions(functions); | |||
#endif |