[Mesa-dev] [PATCH v2 09/23] mesa: add 'no_error' parameter to blit_framebuffer()
Samuel Pitoiset
samuel.pitoiset at gmail.com
Mon Jun 5 22:19:43 UTC 2017
On 06/06/2017 12:10 AM, Timothy Arceri wrote:
> Do we want to force inlining of blit_framebuffer()? Wrapping the error
> variant calls in blit_framebuffer_err() to avoid excess inlining?
Mmh yeah, that might be too much to force inlining for both paths.
I will update this one, thanks.
>
> On 06/06/17 07:43, Samuel Pitoiset wrote:
>> The whole GLES3 block has been moved before the buffer validation
>> checks.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>> src/mesa/main/blit.c | 192
>> +++++++++++++++++++++++++--------------------------
>> 1 file changed, 95 insertions(+), 97 deletions(-)
>>
>> diff --git a/src/mesa/main/blit.c b/src/mesa/main/blit.c
>> index 2c0300eab3..970c357335 100644
>> --- a/src/mesa/main/blit.c
>> +++ b/src/mesa/main/blit.c
>> @@ -182,12 +182,8 @@ blit_framebuffer(struct gl_context *ctx,
>> struct gl_framebuffer *readFb, struct
>> gl_framebuffer *drawFb,
>> GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>> GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>> - GLbitfield mask, GLenum filter, const char *func)
>> + GLbitfield mask, GLenum filter, bool no_error, const
>> char *func)
>> {
>> - const GLbitfield legalMaskBits = (GL_COLOR_BUFFER_BIT |
>> - GL_DEPTH_BUFFER_BIT |
>> - GL_STENCIL_BUFFER_BIT);
>> -
>> FLUSH_VERTICES(ctx, 0);
>> /* Update completeness status of readFb and drawFb. */
>> @@ -203,39 +199,99 @@ blit_framebuffer(struct gl_context *ctx,
>> return;
>> }
>> - /* check for complete framebuffers */
>> - if (drawFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||
>> - readFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
>> - _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
>> - "%s(incomplete draw/read buffers)", func);
>> - return;
>> - }
>> + if (!no_error) {
>> + const GLbitfield legalMaskBits = (GL_COLOR_BUFFER_BIT |
>> + GL_DEPTH_BUFFER_BIT |
>> + GL_STENCIL_BUFFER_BIT);
>> - if (!is_valid_blit_filter(ctx, filter)) {
>> - _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid filter %s)", func,
>> - _mesa_enum_to_string(filter));
>> - return;
>> - }
>> + /* check for complete framebuffers */
>> + if (drawFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||
>> + readFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
>> + _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
>> + "%s(incomplete draw/read buffers)", func);
>> + return;
>> + }
>> - if ((filter == GL_SCALED_RESOLVE_FASTEST_EXT ||
>> - filter == GL_SCALED_RESOLVE_NICEST_EXT) &&
>> - (readFb->Visual.samples == 0 || drawFb->Visual.samples > 0)) {
>> - _mesa_error(ctx, GL_INVALID_OPERATION, "%s(%s: invalid
>> samples)", func,
>> - _mesa_enum_to_string(filter));
>> - return;
>> - }
>> + if (!is_valid_blit_filter(ctx, filter)) {
>> + _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid filter %s)",
>> func,
>> + _mesa_enum_to_string(filter));
>> + return;
>> + }
>> - if (mask & ~legalMaskBits) {
>> - _mesa_error(ctx, GL_INVALID_VALUE, "%s(invalid mask bits set)",
>> func);
>> - return;
>> - }
>> + if ((filter == GL_SCALED_RESOLVE_FASTEST_EXT ||
>> + filter == GL_SCALED_RESOLVE_NICEST_EXT) &&
>> + (readFb->Visual.samples == 0 || drawFb->Visual.samples >
>> 0)) {
>> + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(%s: invalid
>> samples)", func,
>> + _mesa_enum_to_string(filter));
>> + return;
>> + }
>> - /* depth/stencil must be blitted with nearest filtering */
>> - if ((mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
>> - && filter != GL_NEAREST) {
>> - _mesa_error(ctx, GL_INVALID_OPERATION,
>> - "%s(depth/stencil requires GL_NEAREST filter)", func);
>> - return;
>> + if (mask & ~legalMaskBits) {
>> + _mesa_error(ctx, GL_INVALID_VALUE, "%s(invalid mask bits
>> set)", func);
>> + return;
>> + }
>> +
>> + /* depth/stencil must be blitted with nearest filtering */
>> + if ((mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
>> + && filter != GL_NEAREST) {
>> + _mesa_error(ctx, GL_INVALID_OPERATION,
>> + "%s(depth/stencil requires GL_NEAREST filter)", func);
>> + return;
>> + }
>> +
>> + if (_mesa_is_gles3(ctx)) {
>> + /* Page 194 (page 206 of the PDF) in section 4.3.2 of the
>> OpenGL ES
>> + * 3.0.1 spec says:
>> + *
>> + * "If SAMPLE_BUFFERS for the draw framebuffer is
>> greater than
>> + * zero, an INVALID_OPERATION error is generated."
>> + */
>> + if (drawFb->Visual.samples > 0) {
>> + _mesa_error(ctx, GL_INVALID_OPERATION,
>> + "%s(destination samples must be 0)", func);
>> + return;
>> + }
>> +
>> + /* Page 194 (page 206 of the PDF) in section 4.3.2 of the
>> OpenGL ES
>> + * 3.0.1 spec says:
>> + *
>> + * "If SAMPLE_BUFFERS for the read framebuffer is
>> greater than
>> + * zero, no copy is performed and an INVALID_OPERATION
>> error is
>> + * generated if the formats of the read and draw
>> framebuffers are
>> + * not identical or if the source and destination
>> rectangles are
>> + * not defined with the same (X0, Y0) and (X1, Y1) bounds."
>> + *
>> + * The format check was made above because desktop OpenGL
>> has the same
>> + * requirement.
>> + */
>> + if (readFb->Visual.samples > 0
>> + && (srcX0 != dstX0 || srcY0 != dstY0
>> + || srcX1 != dstX1 || srcY1 != dstY1)) {
>> + _mesa_error(ctx, GL_INVALID_OPERATION,
>> + "%s(bad src/dst multisample region)", func);
>> + return;
>> + }
>> + } else {
>> + if (readFb->Visual.samples > 0 &&
>> + drawFb->Visual.samples > 0 &&
>> + readFb->Visual.samples != drawFb->Visual.samples) {
>> + _mesa_error(ctx, GL_INVALID_OPERATION,
>> + "%s(mismatched samples)", func);
>> + return;
>> + }
>> +
>> + /* extra checks for multisample copies... */
>> + if ((readFb->Visual.samples > 0 || drawFb->Visual.samples >
>> 0) &&
>> + (filter == GL_NEAREST || filter == GL_LINEAR)) {
>> + /* src and dest region sizes must be the same */
>> + if (abs(srcX1 - srcX0) != abs(dstX1 - dstX0) ||
>> + abs(srcY1 - srcY0) != abs(dstY1 - dstY0)) {
>> + _mesa_error(ctx, GL_INVALID_OPERATION,
>> + "%s(bad src/dst multisample region
>> sizes)", func);
>> + return;
>> + }
>> + }
>> + }
>> }
>> /* get color read/draw renderbuffers */
>> @@ -253,8 +309,7 @@ blit_framebuffer(struct gl_context *ctx,
>> */
>> if (!colorReadRb || numColorDrawBuffers == 0) {
>> mask &= ~GL_COLOR_BUFFER_BIT;
>> - }
>> - else {
>> + } else if (!no_error) {
>> for (i = 0; i < numColorDrawBuffers; i++) {
>> colorDrawRb = drawFb->_ColorDrawBuffers[i];
>> if (!colorDrawRb)
>> @@ -331,8 +386,7 @@ blit_framebuffer(struct gl_context *ctx,
>> */
>> if ((readRb == NULL) || (drawRb == NULL)) {
>> mask &= ~GL_STENCIL_BUFFER_BIT;
>> - }
>> - else {
>> + } else if (!no_error) {
>> int read_z_bits, draw_z_bits;
>> if (_mesa_is_gles3(ctx) && (drawRb == readRb)) {
>> @@ -385,8 +439,7 @@ blit_framebuffer(struct gl_context *ctx,
>> */
>> if ((readRb == NULL) || (drawRb == NULL)) {
>> mask &= ~GL_DEPTH_BUFFER_BIT;
>> - }
>> - else {
>> + } else if (!no_error) {
>> int read_s_bit, draw_s_bit;
>> if (_mesa_is_gles3(ctx) && (drawRb == readRb)) {
>> @@ -420,61 +473,6 @@ blit_framebuffer(struct gl_context *ctx,
>> }
>> }
>> -
>> - if (_mesa_is_gles3(ctx)) {
>> - /* Page 194 (page 206 of the PDF) in section 4.3.2 of the
>> OpenGL ES
>> - * 3.0.1 spec says:
>> - *
>> - * "If SAMPLE_BUFFERS for the draw framebuffer is greater
>> than zero,
>> - * an INVALID_OPERATION error is generated."
>> - */
>> - if (drawFb->Visual.samples > 0) {
>> - _mesa_error(ctx, GL_INVALID_OPERATION,
>> - "%s(destination samples must be 0)", func);
>> - return;
>> - }
>> -
>> - /* Page 194 (page 206 of the PDF) in section 4.3.2 of the
>> OpenGL ES
>> - * 3.0.1 spec says:
>> - *
>> - * "If SAMPLE_BUFFERS for the read framebuffer is greater
>> than zero,
>> - * no copy is performed and an INVALID_OPERATION error is
>> generated
>> - * if the formats of the read and draw framebuffers are not
>> - * identical or if the source and destination rectangles
>> are not
>> - * defined with the same (X0, Y0) and (X1, Y1) bounds."
>> - *
>> - * The format check was made above because desktop OpenGL has
>> the same
>> - * requirement.
>> - */
>> - if (readFb->Visual.samples > 0
>> - && (srcX0 != dstX0 || srcY0 != dstY0
>> - || srcX1 != dstX1 || srcY1 != dstY1)) {
>> - _mesa_error(ctx, GL_INVALID_OPERATION,
>> - "%s(bad src/dst multisample region)", func);
>> - return;
>> - }
>> - } else {
>> - if (readFb->Visual.samples > 0 &&
>> - drawFb->Visual.samples > 0 &&
>> - readFb->Visual.samples != drawFb->Visual.samples) {
>> - _mesa_error(ctx, GL_INVALID_OPERATION,
>> - "%s(mismatched samples)", func);
>> - return;
>> - }
>> -
>> - /* extra checks for multisample copies... */
>> - if ((readFb->Visual.samples > 0 || drawFb->Visual.samples > 0) &&
>> - (filter == GL_NEAREST || filter == GL_LINEAR)) {
>> - /* src and dest region sizes must be the same */
>> - if (abs(srcX1 - srcX0) != abs(dstX1 - dstX0) ||
>> - abs(srcY1 - srcY0) != abs(dstY1 - dstY0)) {
>> - _mesa_error(ctx, GL_INVALID_OPERATION,
>> - "%s(bad src/dst multisample region sizes)",
>> func);
>> - return;
>> - }
>> - }
>> - }
>> -
>> /* Debug code */
>> if (DEBUG_BLIT) {
>> const struct gl_renderbuffer *colorReadRb =
>> readFb->_ColorReadBuffer;
>> @@ -563,7 +561,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0,
>> GLint srcX1, GLint srcY1,
>> blit_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
>> srcX0, srcY0, srcX1, srcY1,
>> dstX0, dstY0, dstX1, dstY1,
>> - mask, filter, "glBlitFramebuffer");
>> + mask, filter, false, "glBlitFramebuffer");
>> }
>> @@ -614,5 +612,5 @@ _mesa_BlitNamedFramebuffer(GLuint readFramebuffer,
>> GLuint drawFramebuffer,
>> blit_framebuffer(ctx, readFb, drawFb,
>> srcX0, srcY0, srcX1, srcY1,
>> dstX0, dstY0, dstX1, dstY1,
>> - mask, filter, "glBlitNamedFramebuffer");
>> + mask, filter, false, "glBlitNamedFramebuffer");
>> }
>>
More information about the mesa-dev
mailing list