summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/framebuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main/framebuffer.c')
-rw-r--r--src/mesa/main/framebuffer.c77
1 files changed, 61 insertions, 16 deletions
diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c
index c06130dc8d7..9002020b7a7 100644
--- a/src/mesa/main/framebuffer.c
+++ b/src/mesa/main/framebuffer.c
@@ -44,6 +44,7 @@
#include "renderbuffer.h"
#include "texobj.h"
#include "glformats.h"
+#include "state.h"
@@ -835,22 +836,54 @@ _mesa_dest_buffer_exists(struct gl_context *ctx, GLenum format)
/**
- * Used to answer the GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES query.
+ * Used to answer the GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES queries (using
+ * GetIntegerv, GetFramebufferParameteriv, etc)
+ *
+ * If @fb is NULL, the method returns the value for the current bound
+ * framebuffer.
*/
GLenum
-_mesa_get_color_read_format(struct gl_context *ctx)
+_mesa_get_color_read_format(struct gl_context *ctx,
+ struct gl_framebuffer *fb,
+ const char *caller)
{
- if (!ctx->ReadBuffer || !ctx->ReadBuffer->_ColorReadBuffer) {
- /* The spec is unclear how to handle this case, but NVIDIA's
- * driver generates GL_INVALID_OPERATION.
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+
+ if (fb == NULL)
+ fb = ctx->ReadBuffer;
+
+ if (!fb || !fb->_ColorReadBuffer) {
+ /*
+ * From OpenGL 4.5 spec, section 18.2.2 "ReadPixels":
+ *
+ * "An INVALID_OPERATION error is generated by GetIntegerv if pname
+ * is IMPLEMENTATION_COLOR_READ_FORMAT or IMPLEMENTATION_COLOR_-
+ * READ_TYPE and any of:
+ * * the read framebuffer is not framebuffer complete.
+ * * the read framebuffer is a framebuffer object, and the selected
+ * read buffer (see section 18.2.1) has no image attached.
+ * * the selected read buffer is NONE."
+ *
+ * There is not equivalent quote for GetFramebufferParameteriv or
+ * GetNamedFramebufferParameteriv, but from section 9.2.3 "Framebuffer
+ * Object Queries":
+ *
+ * "Values of framebuffer-dependent state are identical to those that
+ * would be obtained were the framebuffer object bound and queried
+ * using the simple state queries in that table."
+ *
+ * Where "using the simple state queries" refer to use GetIntegerv. So
+ * we will assume that on that situation the same error should be
+ * triggered too.
*/
_mesa_error(ctx, GL_INVALID_OPERATION,
- "glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT: "
- "no GL_READ_BUFFER)");
+ "%s(GL_IMPLEMENTATION_COLOR_READ_FORMAT: no GL_READ_BUFFER)",
+ caller);
return GL_NONE;
}
else {
- const mesa_format format = ctx->ReadBuffer->_ColorReadBuffer->Format;
+ const mesa_format format = fb->_ColorReadBuffer->Format;
const GLenum data_type = _mesa_get_format_datatype(format);
if (format == MESA_FORMAT_B8G8R8A8_UNORM)
@@ -872,22 +905,34 @@ _mesa_get_color_read_format(struct gl_context *ctx)
/**
- * Used to answer the GL_IMPLEMENTATION_COLOR_READ_TYPE_OES query.
+ * Used to answer the GL_IMPLEMENTATION_COLOR_READ_TYPE_OES queries (using
+ * GetIntegerv, GetFramebufferParameteriv, etc)
+ *
+ * If @fb is NULL, the method returns the value for the current bound
+ * framebuffer.
*/
GLenum
-_mesa_get_color_read_type(struct gl_context *ctx)
+_mesa_get_color_read_type(struct gl_context *ctx,
+ struct gl_framebuffer *fb,
+ const char *caller)
{
- if (!ctx->ReadBuffer || !ctx->ReadBuffer->_ColorReadBuffer) {
- /* The spec is unclear how to handle this case, but NVIDIA's
- * driver generates GL_INVALID_OPERATION.
+ if (ctx->NewState)
+ _mesa_update_state(ctx);
+
+ if (fb == NULL)
+ fb = ctx->ReadBuffer;
+
+ if (!fb || !fb->_ColorReadBuffer) {
+ /*
+ * See comment on _mesa_get_color_read_format
*/
_mesa_error(ctx, GL_INVALID_OPERATION,
- "glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE: "
- "no GL_READ_BUFFER)");
+ "%s(GL_IMPLEMENTATION_COLOR_READ_TYPE: no GL_READ_BUFFER)",
+ caller);
return GL_NONE;
}
else {
- const GLenum format = ctx->ReadBuffer->_ColorReadBuffer->Format;
+ const GLenum format = fb->_ColorReadBuffer->Format;
const GLenum data_type = _mesa_get_format_datatype(format);
if (format == MESA_FORMAT_B5G6R5_UNORM)