mesa: handle missing read buffer in _mesa_get_color_read_format/type()
We were crashing when GL_READ_BUFFER == GL_NONE. Check for NULL pointers and reorganize the code. The spec doesn't say which error to generate in this situation, but NVIDIA raises GL_INVALID_OPERATION. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=65173 NOTE: This is a candidate for the stable branches. Tested-by: Vedran Rodic <vrodic@gmail.com> Reviewed-by: José Fonseca <jfonseca@vmware.com>
This commit is contained in:
parent
dcc5b6bfb7
commit
e20a2df401
|
@ -878,18 +878,29 @@ _mesa_dest_buffer_exists(struct gl_context *ctx, GLenum format)
|
|||
GLenum
|
||||
_mesa_get_color_read_format(struct gl_context *ctx)
|
||||
{
|
||||
const GLenum data_type = _mesa_get_format_datatype(
|
||||
ctx->ReadBuffer->_ColorReadBuffer->Format);
|
||||
if (!ctx->ReadBuffer || !ctx->ReadBuffer->_ColorReadBuffer) {
|
||||
/* The spec is unclear how to handle this case, but NVIDIA's
|
||||
* driver generates GL_INVALID_OPERATION.
|
||||
*/
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT: "
|
||||
"no GL_READ_BUFFER)");
|
||||
return GL_NONE;
|
||||
}
|
||||
else {
|
||||
const GLenum format = ctx->ReadBuffer->_ColorReadBuffer->Format;
|
||||
const GLenum data_type = _mesa_get_format_datatype(format);
|
||||
|
||||
switch (ctx->ReadBuffer->_ColorReadBuffer->Format) {
|
||||
case MESA_FORMAT_ARGB8888:
|
||||
return GL_BGRA;
|
||||
case MESA_FORMAT_RGB565:
|
||||
return GL_BGR;
|
||||
default:
|
||||
if (data_type == GL_UNSIGNED_INT || data_type == GL_INT) {
|
||||
if (format == MESA_FORMAT_ARGB8888)
|
||||
return GL_BGRA;
|
||||
else if (format == MESA_FORMAT_RGB565)
|
||||
return GL_BGR;
|
||||
|
||||
switch (data_type) {
|
||||
case GL_UNSIGNED_INT:
|
||||
case GL_INT:
|
||||
return GL_RGBA_INTEGER;
|
||||
} else {
|
||||
default:
|
||||
return GL_RGBA;
|
||||
}
|
||||
}
|
||||
|
@ -902,26 +913,33 @@ _mesa_get_color_read_format(struct gl_context *ctx)
|
|||
GLenum
|
||||
_mesa_get_color_read_type(struct gl_context *ctx)
|
||||
{
|
||||
const GLenum data_type = _mesa_get_format_datatype(
|
||||
ctx->ReadBuffer->_ColorReadBuffer->Format);
|
||||
|
||||
switch (ctx->ReadBuffer->_ColorReadBuffer->Format) {
|
||||
case MESA_FORMAT_RGB565:
|
||||
return GL_UNSIGNED_SHORT_5_6_5_REV;
|
||||
default:
|
||||
break;
|
||||
if (!ctx->ReadBuffer || !ctx->ReadBuffer->_ColorReadBuffer) {
|
||||
/* The spec is unclear how to handle this case, but NVIDIA's
|
||||
* driver generates GL_INVALID_OPERATION.
|
||||
*/
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE: "
|
||||
"no GL_READ_BUFFER)");
|
||||
return GL_NONE;
|
||||
}
|
||||
else {
|
||||
const GLenum format = ctx->ReadBuffer->_ColorReadBuffer->Format;
|
||||
const GLenum data_type = _mesa_get_format_datatype(format);
|
||||
|
||||
switch (data_type) {
|
||||
case GL_SIGNED_NORMALIZED:
|
||||
return GL_BYTE;
|
||||
case GL_UNSIGNED_INT:
|
||||
case GL_INT:
|
||||
case GL_FLOAT:
|
||||
return data_type;
|
||||
case GL_UNSIGNED_NORMALIZED:
|
||||
default:
|
||||
return GL_UNSIGNED_BYTE;
|
||||
if (format == MESA_FORMAT_RGB565)
|
||||
return GL_UNSIGNED_SHORT_5_6_5_REV;
|
||||
|
||||
switch (data_type) {
|
||||
case GL_SIGNED_NORMALIZED:
|
||||
return GL_BYTE;
|
||||
case GL_UNSIGNED_INT:
|
||||
case GL_INT:
|
||||
case GL_FLOAT:
|
||||
return data_type;
|
||||
case GL_UNSIGNED_NORMALIZED:
|
||||
default:
|
||||
return GL_UNSIGNED_BYTE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue