mesa: Allow MESA_framebuffer_flip_y for GLES 3
Implement glFramebufferParameteriMESA on GLES 3 so that the extension is not dependant on GLES 3.1 Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
This commit is contained in:
@@ -23,7 +23,7 @@ Status
|
||||
|
||||
Version
|
||||
|
||||
Version 2, June 4, 2019
|
||||
Version 3, August, 2019
|
||||
|
||||
Number
|
||||
|
||||
@@ -32,7 +32,7 @@ Number
|
||||
|
||||
Dependencies
|
||||
|
||||
OpenGL ES 3.1 or OpenGL 4.3 is required, for FramebufferParameteri.
|
||||
Requires OpenGL ES 3.0, OpenGL 4.3, or ARB_framebuffer_no_attachments.
|
||||
|
||||
Overview
|
||||
|
||||
@@ -59,7 +59,10 @@ Issues
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
None
|
||||
OpenGL ES must provide the following functions:
|
||||
|
||||
void FramebufferParameteriMESA(enum target, enum pname, int param);
|
||||
void GetFramebufferParameterivMESA(enum target, enum pname, int *params);
|
||||
|
||||
New Types
|
||||
|
||||
@@ -67,20 +70,35 @@ New Types
|
||||
|
||||
New Tokens
|
||||
|
||||
Accepted by the <pname> argument of FramebufferParameteri and
|
||||
GetFramebufferParameteriv:
|
||||
Accepted by the <pname> argument of FramebufferParameteriMESA and
|
||||
GetFramebufferParameterivMESA:
|
||||
|
||||
GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB
|
||||
|
||||
Interactions with OpenGL 4.3, OpenGL ES 3.1, ARB_framebuffer_no_attachments
|
||||
and any other versions and extensions that provide the entry points
|
||||
FramebufferParameteri and GetFramebufferParameteriv
|
||||
|
||||
Token GL_FRAMEBUFFER_FLIP_Y_MESA is accepted as the <pname> argument of
|
||||
FramebufferParameteri and GetFramebufferParameteriv.
|
||||
|
||||
Errors
|
||||
|
||||
An INVALID_OPERATION error is generated by GetFramebufferParameteriv if the
|
||||
default framebuffer is bound to <target> and <pname> is FRAMEBUFFER_FLIP_Y_MESA.
|
||||
An INVALID_OPERATION error is generated by GetFramebufferParameteriv or
|
||||
GetFramebufferParameterivMESA if the default framebuffer is bound
|
||||
to <target> and <pname> is GL_FRAMEBUFFER_FLIP_Y_MESA.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Revision History
|
||||
|
||||
Version 3, August, 2019
|
||||
Allow OpenGL ES 3.0 to implement by adding functions
|
||||
FramebufferParameteriMESA and GetFramebufferParameterivMESA which were
|
||||
previously only available in OpenGL ES 3.1.
|
||||
|
||||
Version 2, June, 2019
|
||||
Enable extension for OpenGL 4.3 and beyond
|
||||
|
||||
|
@@ -150,6 +150,10 @@ functions = {
|
||||
"FramebufferParameteri": exec_info(compatibility=30, core=31, es2=31),
|
||||
"GetFramebufferParameteriv": exec_info(compatibility=30, core=31, es2=31),
|
||||
|
||||
# OpenGL 4.3 / GL_MESA_framebuffer_flip_y.
|
||||
"FramebufferParameteriMESA": exec_info(core=31, es2=30),
|
||||
"GetFramebufferParameterivMESA": exec_info(core=31, es2=30),
|
||||
|
||||
# OpenGL 4.5 / GL_ARB_direct_state_access. Mesa can expose the extension
|
||||
# with core profile.
|
||||
"CreateTransformFeedbacks": exec_info(compatibility=31, core=31),
|
||||
|
@@ -1499,4 +1499,19 @@
|
||||
</function>
|
||||
</category>
|
||||
|
||||
<!-- 302. GL_MESA_framebuffer_flip_y -->
|
||||
<category name="GL_MESA_framebuffer_flip_y" number="302">
|
||||
<enum name="GL_FRAMEBUFFER_FLIP_Y_MESA" value="0x8BBB"/>
|
||||
<function name="FramebufferParameteriMESA" es2="3.0">
|
||||
<param name="target" type="GLenum"/>
|
||||
<param name="pname" type="GLenum"/>
|
||||
<param name="param" type="GLint" />
|
||||
</function>
|
||||
<function name="GetFramebufferParameterivMESA" es2="3.0">
|
||||
<param name="target" type="GLenum" />
|
||||
<param name="pname" type="GLenum" />
|
||||
<param name="params" type="GLint *" output="true" />
|
||||
</function>
|
||||
</category>
|
||||
|
||||
</OpenGLAPI>
|
||||
|
@@ -1567,6 +1567,8 @@ offsets = {
|
||||
"GetCompressedMultiTexImageEXT": 1531,
|
||||
"GetMultiTexLevelParameterivEXT": 1532,
|
||||
"GetMultiTexLevelParameterfvEXT": 1533,
|
||||
"FramebufferParameteriMESA": 1534,
|
||||
"GetFramebufferParameterivMESA": 1535,
|
||||
}
|
||||
|
||||
functions = [
|
||||
|
@@ -356,7 +356,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 , 43, 43, x , 31, 2018)
|
||||
EXT(MESA_framebuffer_flip_y , MESA_framebuffer_flip_y , 43, 43, x , 30, 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)
|
||||
|
@@ -1625,18 +1625,46 @@ invalid_pname_enum:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
|
||||
}
|
||||
|
||||
static bool
|
||||
validate_framebuffer_parameter_extensions(GLenum pname, const char *func)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
|
||||
!ctx->Extensions.ARB_sample_locations &&
|
||||
!ctx->Extensions.MESA_framebuffer_flip_y) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"%s not supported "
|
||||
"(none of ARB_framebuffer_no_attachments,"
|
||||
" ARB_sample_locations, or"
|
||||
" MESA_framebuffer_flip_y extensions are available)",
|
||||
func);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* If only the MESA_framebuffer_flip_y extension is enabled
|
||||
* pname can only be GL_FRAMEBUFFER_FLIP_Y_MESA
|
||||
*/
|
||||
if (ctx->Extensions.MESA_framebuffer_flip_y &&
|
||||
pname != GL_FRAMEBUFFER_FLIP_Y_MESA &&
|
||||
!(ctx->Extensions.ARB_framebuffer_no_attachments ||
|
||||
ctx->Extensions.ARB_sample_locations)) {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_framebuffer *fb;
|
||||
|
||||
if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
|
||||
!ctx->Extensions.ARB_sample_locations) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glFramebufferParameteriv not supported "
|
||||
"(neither ARB_framebuffer_no_attachments nor ARB_sample_locations"
|
||||
" is available)");
|
||||
if (!validate_framebuffer_parameter_extensions(pname,
|
||||
"glFramebufferParameteri")) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1650,6 +1678,12 @@ _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
|
||||
framebuffer_parameteri(ctx, fb, pname, param, "glFramebufferParameteri");
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_FramebufferParameteriMESA(GLenum target, GLenum pname, GLint param)
|
||||
{
|
||||
_mesa_FramebufferParameteri(target, pname, param);
|
||||
}
|
||||
|
||||
static bool
|
||||
validate_get_framebuffer_parameteriv_pname(struct gl_context *ctx,
|
||||
struct gl_framebuffer *fb,
|
||||
@@ -1779,12 +1813,8 @@ _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
struct gl_framebuffer *fb;
|
||||
|
||||
if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
|
||||
!ctx->Extensions.ARB_sample_locations) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glGetFramebufferParameteriv not supported "
|
||||
"(neither ARB_framebuffer_no_attachments nor ARB_sample_locations"
|
||||
" is available)");
|
||||
if (!validate_framebuffer_parameter_extensions(pname,
|
||||
"glGetFramebufferParameteriv")) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1799,6 +1829,11 @@ _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
|
||||
"glGetFramebufferParameteriv");
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_GetFramebufferParameterivMESA(GLenum target, GLenum pname, GLint *params)
|
||||
{
|
||||
_mesa_GetFramebufferParameteriv(target, pname, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified renderbuffer or texture from any attachment point in
|
||||
|
@@ -404,9 +404,15 @@ _mesa_DiscardFramebufferEXT(GLenum target, GLsizei numAttachments,
|
||||
extern void GLAPIENTRY
|
||||
_mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_FramebufferParameteriMESA(GLenum target, GLenum pname, GLint param);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_GetFramebufferParameterivMESA(GLenum target, GLenum pname, GLint *params);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_FramebufferSampleLocationsfvARB(GLenum target, GLuint start,
|
||||
GLsizei count, const GLfloat *v);
|
||||
|
@@ -1412,6 +1412,10 @@ const struct function common_desktop_functions_possible[] = {
|
||||
/* GL_EXT_shader_image_load_store */
|
||||
{ "glBindImageTextureEXT", 30, -1 },
|
||||
|
||||
/* GL_MESA_framebuffer_flip_y */
|
||||
{ "glFramebufferParameteriMESA", 43, -1 },
|
||||
{ "glGetFramebufferParameterivMESA", 43, -1 },
|
||||
|
||||
{ NULL, 0, -1 }
|
||||
};
|
||||
|
||||
@@ -2653,6 +2657,10 @@ const struct function gles3_functions_possible[] = {
|
||||
{ "glRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
|
||||
{ "glNamedRenderbufferStorageMultisampleAdvancedAMD", 11, -1 },
|
||||
|
||||
/* GL_MESA_framebuffer_flip_y */
|
||||
{ "glFramebufferParameteriMESA", 30, -1 },
|
||||
{ "glGetFramebufferParameterivMESA", 30, -1 },
|
||||
|
||||
{ NULL, 0, -1 }
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user