瀏覽代碼

mesa: Move OES_read_format support from drivers into the core.

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
Eric Anholt 15 年之前
父節點
當前提交
cd6b8dd9e8

+ 0
- 4
src/mesa/main/context.c 查看文件

@@ -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;

+ 26
- 0
src/mesa/main/framebuffer.c 查看文件

@@ -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;
}
}

+ 5
- 0
src/mesa/main/framebuffer.h 查看文件

@@ -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 */

+ 9
- 8
src/mesa/main/get.c 查看文件

@@ -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");

+ 3
- 2
src/mesa/main/get_gen.py 查看文件

@@ -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 )

+ 0
- 3
src/mesa/main/mtypes.h 查看文件

@@ -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 */

+ 0
- 1
src/mesa/sources.mak 查看文件

@@ -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 \

+ 0
- 97
src/mesa/state_tracker/st_cb_get.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;
}

+ 0
- 37
src/mesa/state_tracker/st_cb_get.h 查看文件

@@ -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

+ 0
- 2
src/mesa/state_tracker/st_context.c 查看文件

@@ -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

Loading…
取消
儲存