diff options
Diffstat (limited to 'src/mesa/main')
-rw-r--r-- | src/mesa/main/accum.c | 17 | ||||
-rw-r--r-- | src/mesa/main/dd.h | 3 | ||||
-rw-r--r-- | src/mesa/main/extensions_table.h | 1 | ||||
-rw-r--r-- | src/mesa/main/fbobject.c | 16 | ||||
-rw-r--r-- | src/mesa/main/framebuffer.c | 1 | ||||
-rw-r--r-- | src/mesa/main/glheader.h | 3 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 4 | ||||
-rw-r--r-- | src/mesa/main/readpix.c | 20 |
8 files changed, 48 insertions, 17 deletions
diff --git a/src/mesa/main/accum.c b/src/mesa/main/accum.c index f5ac8a10270..a0a206bea67 100644 --- a/src/mesa/main/accum.c +++ b/src/mesa/main/accum.c @@ -82,7 +82,8 @@ _mesa_clear_accum_buffer(struct gl_context *ctx) height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin; ctx->Driver.MapRenderbuffer(ctx, accRb, x, y, width, height, - GL_MAP_WRITE_BIT, &accMap, &accRowStride); + GL_MAP_WRITE_BIT, &accMap, &accRowStride, + ctx->DrawBuffer->FlipY); if (!accMap) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAccum"); @@ -137,7 +138,8 @@ accum_scale_or_bias(struct gl_context *ctx, GLfloat value, ctx->Driver.MapRenderbuffer(ctx, accRb, xpos, ypos, width, height, GL_MAP_READ_BIT | GL_MAP_WRITE_BIT, - &accMap, &accRowStride); + &accMap, &accRowStride, + ctx->DrawBuffer->FlipY); if (!accMap) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAccum"); @@ -206,7 +208,8 @@ accum_or_load(struct gl_context *ctx, GLfloat value, /* Map accum buffer */ ctx->Driver.MapRenderbuffer(ctx, accRb, xpos, ypos, width, height, - mappingFlags, &accMap, &accRowStride); + mappingFlags, &accMap, &accRowStride, + ctx->DrawBuffer->FlipY); if (!accMap) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAccum"); return; @@ -215,7 +218,8 @@ accum_or_load(struct gl_context *ctx, GLfloat value, /* Map color buffer */ ctx->Driver.MapRenderbuffer(ctx, colorRb, xpos, ypos, width, height, GL_MAP_READ_BIT, - &colorMap, &colorRowStride); + &colorMap, &colorRowStride, + ctx->DrawBuffer->FlipY); if (!colorMap) { ctx->Driver.UnmapRenderbuffer(ctx, accRb); _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAccum"); @@ -288,7 +292,7 @@ accum_return(struct gl_context *ctx, GLfloat value, /* Map accum buffer */ ctx->Driver.MapRenderbuffer(ctx, accRb, xpos, ypos, width, height, GL_MAP_READ_BIT, - &accMap, &accRowStride); + &accMap, &accRowStride, fb->FlipY); if (!accMap) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAccum"); return; @@ -308,7 +312,8 @@ accum_return(struct gl_context *ctx, GLfloat value, /* Map color buffer */ ctx->Driver.MapRenderbuffer(ctx, colorRb, xpos, ypos, width, height, - mappingFlags, &colorMap, &colorRowStride); + mappingFlags, &colorMap, &colorRowStride, + fb->FlipY); if (!colorMap) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAccum"); continue; diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 78e99bfa235..f14c3e04e91 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -429,7 +429,8 @@ struct dd_function_table { struct gl_renderbuffer *rb, GLuint x, GLuint y, GLuint w, GLuint h, GLbitfield mode, - GLubyte **mapOut, GLint *rowStrideOut); + GLubyte **mapOut, GLint *rowStrideOut, + bool flip_y); void (*UnmapRenderbuffer)(struct gl_context *ctx, struct gl_renderbuffer *rb); diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index f4f7f01d6e4..3f01896cae7 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -323,6 +323,7 @@ EXT(KHR_texture_compression_astc_hdr , KHR_texture_compression_astc_hdr EXT(KHR_texture_compression_astc_ldr , KHR_texture_compression_astc_ldr , GLL, GLC, x , ES2, 2012) EXT(KHR_texture_compression_astc_sliced_3d , KHR_texture_compression_astc_sliced_3d , GLL, GLC, x , ES2, 2015) +EXT(MESA_framebuffer_flip_y , MESA_framebuffer_flip_y , x, x, x , 31, 2018) EXT(MESA_pack_invert , MESA_pack_invert , GLL, GLC, x , x , 2002) EXT(MESA_shader_integer_functions , MESA_shader_integer_functions , GLL, GLC, x , 30, 2016) EXT(MESA_texture_signed_rgba , EXT_texture_snorm , GLL, GLC, x , x , 2009) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index fa7a9361dfc..750d7f45e34 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -1430,6 +1430,10 @@ framebuffer_parameteri(struct gl_context *ctx, struct gl_framebuffer *fb, if (!ctx->Extensions.ARB_sample_locations) goto invalid_pname_enum; break; + case GL_FRAMEBUFFER_FLIP_Y_MESA: + if (!ctx->Extensions.MESA_framebuffer_flip_y) + goto invalid_pname_enum; + cannot_be_winsys_fbo = true; default: goto invalid_pname_enum; } @@ -1482,6 +1486,9 @@ framebuffer_parameteri(struct gl_context *ctx, struct gl_framebuffer *fb, case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB: fb->SampleLocationPixelGrid = !!param; break; + case GL_FRAMEBUFFER_FLIP_Y_MESA: + fb->FlipY = param; + break; } switch (pname) { @@ -1574,6 +1581,12 @@ validate_get_framebuffer_parameteriv_pname(struct gl_context *ctx, goto invalid_pname_enum; cannot_be_winsys_fbo = false; break; + case GL_FRAMEBUFFER_FLIP_Y_MESA: + if (!ctx->Extensions.MESA_framebuffer_flip_y) { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname); + return false; + } + break; default: goto invalid_pname_enum; } @@ -1638,6 +1651,9 @@ get_framebuffer_parameteriv(struct gl_context *ctx, struct gl_framebuffer *fb, case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB: *params = fb->SampleLocationPixelGrid; break; + case GL_FRAMEBUFFER_FLIP_Y_MESA: + *params = fb->FlipY; + break; } } diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index 78a80649a04..10dd2fde446 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -159,6 +159,7 @@ _mesa_initialize_window_framebuffer(struct gl_framebuffer *fb, fb->_AllColorBuffersFixedPoint = !visual->floatMode; fb->_HasSNormOrFloatColorBuffer = visual->floatMode; fb->_HasAttachments = true; + fb->FlipY = true; fb->SampleLocationTable = NULL; fb->ProgrammableSampleLocations = 0; diff --git a/src/mesa/main/glheader.h b/src/mesa/main/glheader.h index 16648820b1b..1a91d543126 100644 --- a/src/mesa/main/glheader.h +++ b/src/mesa/main/glheader.h @@ -160,6 +160,9 @@ typedef void *GLeglImageOES; #define GL_HALF_FLOAT_OES 0x8D61 #endif +#ifndef GL_MESA_framebuffer_flip_y +#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB +#endif /** * Internal token to represent a GLSL shader program (a collection of diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 7ef7a3f1106..d71872835d1 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3507,6 +3507,9 @@ struct gl_framebuffer struct gl_renderbuffer *_ColorDrawBuffers[MAX_DRAW_BUFFERS]; struct gl_renderbuffer *_ColorReadBuffer; + /* GL_MESA_framebuffer_flip_y */ + bool FlipY; + /** Delete this framebuffer */ void (*Delete)(struct gl_framebuffer *fb); }; @@ -4253,6 +4256,7 @@ struct gl_extensions GLboolean KHR_texture_compression_astc_hdr; GLboolean KHR_texture_compression_astc_ldr; GLboolean KHR_texture_compression_astc_sliced_3d; + GLboolean MESA_framebuffer_flip_y; GLboolean MESA_tile_raster_order; GLboolean MESA_pack_invert; GLboolean EXT_shader_framebuffer_fetch; diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c index c5fc66988b7..e8c28d86162 100644 --- a/src/mesa/main/readpix.c +++ b/src/mesa/main/readpix.c @@ -234,7 +234,7 @@ readpixels_memcpy(struct gl_context *ctx, format, type, 0, 0); ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, - &map, &stride); + &map, &stride, ctx->ReadBuffer->FlipY); if (!map) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); return GL_TRUE; /* don't bother trying the slow path */ @@ -285,7 +285,7 @@ read_uint_depth_pixels( struct gl_context *ctx, return GL_FALSE; ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, - &map, &stride); + &map, &stride, fb->FlipY); if (!map) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); @@ -343,7 +343,7 @@ read_depth_pixels( struct gl_context *ctx, GL_DEPTH_COMPONENT, type, 0, 0); ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, - &map, &stride); + &map, &stride, fb->FlipY); if (!map) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); return; @@ -391,7 +391,7 @@ read_stencil_pixels( struct gl_context *ctx, return; ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, - &map, &stride); + &map, &stride, fb->FlipY); if (!map) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); return; @@ -462,7 +462,7 @@ read_rgba_pixels( struct gl_context *ctx, /* Map the source render buffer */ ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, - &map, &rb_stride); + &map, &rb_stride, fb->FlipY); if (!map) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); return; @@ -652,7 +652,7 @@ fast_read_depth_stencil_pixels(struct gl_context *ctx, return GL_FALSE; ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, - &map, &stride); + &map, &stride, fb->FlipY); if (!map) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); return GL_TRUE; /* don't bother trying the slow path */ @@ -692,14 +692,14 @@ fast_read_depth_stencil_pixels_separate(struct gl_context *ctx, return GL_FALSE; ctx->Driver.MapRenderbuffer(ctx, depthRb, x, y, width, height, - GL_MAP_READ_BIT, &depthMap, &depthStride); + GL_MAP_READ_BIT, &depthMap, &depthStride, fb->FlipY); if (!depthMap) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); return GL_TRUE; /* don't bother trying the slow path */ } ctx->Driver.MapRenderbuffer(ctx, stencilRb, x, y, width, height, - GL_MAP_READ_BIT, &stencilMap, &stencilStride); + GL_MAP_READ_BIT, &stencilMap, &stencilStride, fb->FlipY); if (!stencilMap) { ctx->Driver.UnmapRenderbuffer(ctx, depthRb); _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); @@ -756,7 +756,7 @@ slow_read_depth_stencil_pixels_separate(struct gl_context *ctx, * If one buffer, only map it once. */ ctx->Driver.MapRenderbuffer(ctx, depthRb, x, y, width, height, - GL_MAP_READ_BIT, &depthMap, &depthStride); + GL_MAP_READ_BIT, &depthMap, &depthStride, fb->FlipY); if (!depthMap) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); return; @@ -765,7 +765,7 @@ slow_read_depth_stencil_pixels_separate(struct gl_context *ctx, if (stencilRb != depthRb) { ctx->Driver.MapRenderbuffer(ctx, stencilRb, x, y, width, height, GL_MAP_READ_BIT, &stencilMap, - &stencilStride); + &stencilStride, fb->FlipY); if (!stencilMap) { ctx->Driver.UnmapRenderbuffer(ctx, depthRb); _mesa_error(ctx, GL_OUT_OF_MEMORY, "glReadPixels"); |