1. The loop over dest buffers in blit_linear() needed a null pointer
check. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=59499
2. The code to grab the drawRb's format needs to be inside the drawing loop.
3. An equality test was using = instead of == thus messing up a
renderbuffer attachment texture pointer. This lead to memory
corruption and a crash at exit.
Finally, fix a capitalization error NumDrawBuffers -> numDrawBuffers
and change type to unsigned to fix signed/unsigned comparison warnings.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
struct gl_renderbuffer_attachment *readAtt, *drawAtt;
struct gl_framebuffer *readFb = ctx->ReadBuffer;
struct gl_framebuffer *drawFb = ctx->DrawBuffer;
struct gl_renderbuffer_attachment *readAtt, *drawAtt;
struct gl_framebuffer *readFb = ctx->ReadBuffer;
struct gl_framebuffer *drawFb = ctx->DrawBuffer;
- GLint NumDrawBuffers = 0;
+ GLuint numDrawBuffers = 0;
GLuint i;
const GLint srcWidth = ABS(srcX1 - srcX0);
GLuint i;
const GLint srcWidth = ABS(srcX1 - srcX0);
case GL_COLOR_BUFFER_BIT:
readAtt = &readFb->Attachment[readFb->_ColorReadBufferIndex];
readRb = readFb->_ColorReadBuffer;
case GL_COLOR_BUFFER_BIT:
readAtt = &readFb->Attachment[readFb->_ColorReadBufferIndex];
readRb = readFb->_ColorReadBuffer;
- NumDrawBuffers = drawFb->_NumColorDrawBuffers;
+ numDrawBuffers = drawFb->_NumColorDrawBuffers;
break;
case GL_DEPTH_BUFFER_BIT:
readAtt = &readFb->Attachment[BUFFER_DEPTH];
drawAtt = &drawFb->Attachment[BUFFER_DEPTH];
readRb = readAtt->Renderbuffer;
drawRb = drawAtt->Renderbuffer;
break;
case GL_DEPTH_BUFFER_BIT:
readAtt = &readFb->Attachment[BUFFER_DEPTH];
drawAtt = &drawFb->Attachment[BUFFER_DEPTH];
readRb = readAtt->Renderbuffer;
drawRb = drawAtt->Renderbuffer;
/* Note that for depth/stencil, the formats of src/dst must match. By
* using the core helpers for pack/unpack, we avoid needing to handle
/* Note that for depth/stencil, the formats of src/dst must match. By
* using the core helpers for pack/unpack, we avoid needing to handle
drawAtt = &drawFb->Attachment[BUFFER_STENCIL];
readRb = readAtt->Renderbuffer;
drawRb = drawAtt->Renderbuffer;
drawAtt = &drawFb->Attachment[BUFFER_STENCIL];
readRb = readAtt->Renderbuffer;
drawRb = drawAtt->Renderbuffer;
mode = UNPACK_S;
pixelSize = 1;
break;
mode = UNPACK_S;
pixelSize = 1;
break;
}
/* Blit to all the draw buffers */
}
/* Blit to all the draw buffers */
- for (i = 0; i < NumDrawBuffers; i++) {
+ for (i = 0; i < numDrawBuffers; i++) {
if (buffer == GL_COLOR_BUFFER_BIT) {
int idx = drawFb->_ColorDrawBufferIndexes[i];
if (idx == -1)
if (buffer == GL_COLOR_BUFFER_BIT) {
int idx = drawFb->_ColorDrawBufferIndexes[i];
if (idx == -1)
drawAtt = &drawFb->Attachment[idx];
drawRb = drawAtt->Renderbuffer;
drawAtt = &drawFb->Attachment[idx];
drawRb = drawAtt->Renderbuffer;
+ if (!drawRb)
+ continue;
+
if (readRb->Format == drawRb->Format) {
mode = DIRECT;
pixelSize = _mesa_get_format_bytes(readRb->Format);
if (readRb->Format == drawRb->Format) {
mode = DIRECT;
pixelSize = _mesa_get_format_bytes(readRb->Format);
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)
{
struct gl_framebuffer *drawFb = ctx->DrawBuffer;
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)
{
struct gl_framebuffer *drawFb = ctx->DrawBuffer;
- struct gl_renderbuffer *drawRb = NULL;
- struct gl_renderbuffer_attachment *drawAtt = NULL;
struct gl_framebuffer *readFb = ctx->ReadBuffer;
struct gl_renderbuffer *readRb = readFb->_ColorReadBuffer;
struct gl_renderbuffer_attachment *readAtt =
struct gl_framebuffer *readFb = ctx->ReadBuffer;
struct gl_renderbuffer *readRb = readFb->_ColorReadBuffer;
struct gl_renderbuffer_attachment *readAtt =
GLvoid *dstBuffer;
gl_format readFormat = _mesa_get_srgb_format_linear(readRb->Format);
GLvoid *dstBuffer;
gl_format readFormat = _mesa_get_srgb_format_linear(readRb->Format);
- gl_format drawFormat = _mesa_get_srgb_format_linear(drawRb->Format);
GLuint bpp = _mesa_get_format_bytes(readFormat);
GLenum pixelType;
GLuint bpp = _mesa_get_format_bytes(readFormat);
GLenum pixelType;
}
for (i = 0; i < drawFb->_NumColorDrawBuffers; i++) {
}
for (i = 0; i < drawFb->_NumColorDrawBuffers; i++) {
- int idx = drawFb->_ColorDrawBufferIndexes[i];
+ GLint idx = drawFb->_ColorDrawBufferIndexes[i];
+ struct gl_renderbuffer_attachment *drawAtt;
+ struct gl_renderbuffer *drawRb;
+ gl_format drawFormat;
+
drawAtt = &drawFb->Attachment[idx];
drawRb = drawAtt->Renderbuffer;
drawAtt = &drawFb->Attachment[idx];
drawRb = drawAtt->Renderbuffer;
+ if (!drawRb)
+ continue;
+
+ drawFormat = _mesa_get_srgb_format_linear(drawRb->Format);
+
/*
* Map src / dst renderbuffers
*/
if ((readRb == drawRb) ||
(readAtt->Texture && drawAtt->Texture &&
/*
* Map src / dst renderbuffers
*/
if ((readRb == drawRb) ||
(readAtt->Texture && drawAtt->Texture &&
- (readAtt->Texture = drawAtt->Texture))) {
+ (readAtt->Texture == drawAtt->Texture))) {
/* map whole buffer for read/write */
ctx->Driver.MapRenderbuffer(ctx, readRb,
0, 0, readRb->Width, readRb->Height,
/* map whole buffer for read/write */
ctx->Driver.MapRenderbuffer(ctx, readRb,
0, 0, readRb->Width, readRb->Height,