On Mon, Mar 28, 2016 at 3:07 PM, Ian Romanick <i...@freedesktop.org> wrote: > On 02/27/2016 01:39 PM, Ilia Mirkin wrote: >> On Sat, Feb 27, 2016 at 4:30 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote: >>> Allow ES 3.1 contexts to access the texture buffer functionality. >>> >>> Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> >>> --- >>> docs/GL3.txt | 2 +- >>> src/mapi/glapi/gen/apiexec.py | 4 ++-- >>> src/mapi/glapi/gen/es_EXT.xml | 36 ++++++++++++++++++++++++++++++ >>> src/mesa/main/bufferobj.c | 4 ++-- >>> src/mesa/main/get.c | 4 ++-- >>> src/mesa/main/get_hash_params.py | 20 ++++++++--------- >>> src/mesa/main/tests/dispatch_sanity.cpp | 4 ++++ >>> src/mesa/main/teximage.c | 20 +++++++++++------ >>> src/mesa/main/texobj.c | 8 +++---- >>> src/mesa/main/texparam.c | 39 >>> +++++++++++++++++---------------- >>> 10 files changed, 94 insertions(+), 47 deletions(-) >>> >>> diff --git a/docs/GL3.txt b/docs/GL3.txt >>> index b9d9713..2f81cba 100644 >>> --- a/docs/GL3.txt >>> +++ b/docs/GL3.txt >>> @@ -254,7 +254,7 @@ GLES3.2, GLSL ES 3.2 >>> GL_OES_shader_multisample_interpolation DONE (nvc0, r600, >>> radeonsi) >>> GL_OES_tessellation_shader not started (based >>> on GL_ARB_tessellation_shader, which is done for some drivers) >>> GL_OES_texture_border_clamp DONE (all drivers) >>> - GL_OES_texture_buffer not started (based >>> on GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_range, and >>> GL_ARB_texture_buffer_object_rgb32 that are all done) >>> + GL_OES_texture_buffer DONE () >>> GL_OES_texture_cube_map_array not started (based >>> on GL_ARB_texture_cube_map_array, which is done for all drivers) >>> GL_OES_texture_stencil8 DONE (all drivers >>> that support GL_ARB_texture_stencil8) >>> GL_OES_texture_storage_multisample_2d_array DONE (all drivers >>> that support GL_ARB_texture_multisample) >>> diff --git a/src/mapi/glapi/gen/apiexec.py b/src/mapi/glapi/gen/apiexec.py >>> index 2a80432..b4f4cf6 100644 >>> --- a/src/mapi/glapi/gen/apiexec.py >>> +++ b/src/mapi/glapi/gen/apiexec.py >>> @@ -68,7 +68,7 @@ class exec_info(): >>> functions = { >>> # OpenGL 3.1 / GL_ARB_texture_buffer_object. Mesa only exposes this >>> # extension with core profile. >>> - "TexBuffer": exec_info(core=31), >>> + "TexBuffer": exec_info(core=31, es2=31), >>> >>> # OpenGL 3.2 / GL_OES_geometry_shader. >>> "FramebufferTexture": exec_info(core=32, es2=31), >>> @@ -146,7 +146,7 @@ functions = { >>> >>> # OpenGL 4.3 / GL_ARB_texture_buffer_range. Mesa can expose the >>> extension >>> # with OpenGL 3.1. >>> - "TexBufferRange": exec_info(core=31), >>> + "TexBufferRange": exec_info(core=31, es2=31), >>> >>> # OpenGL 4.3 / GL_ARB_framebuffer_no_attachments. Mesa can expose the >>> # extension with OpenGL 3.0. >>> diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml >>> index 2b83a97..ee8e9e5 100644 >>> --- a/src/mapi/glapi/gen/es_EXT.xml >>> +++ b/src/mapi/glapi/gen/es_EXT.xml >>> @@ -853,6 +853,24 @@ >>> >>> </category> >>> >>> +<category name="GL_EXT_texture_buffer" number="183"> >>> + >>> + <function name="TexBufferEXT" es2="3.1" alias="TexBuffer"> >>> + <param name="target" type="GLenum"/> >>> + <param name="internalFormat" type="GLenum"/> >>> + <param name="buffer" type="GLuint"/> >>> + </function> >>> + >>> + <function name="TexBufferRangeEXT" es2="3.1" alias="TexBufferRange"> >>> + <param name="target" type="GLenum"/> >>> + <param name="internalformat" type="GLenum"/> >>> + <param name="buffer" type="GLuint"/> >>> + <param name="offset" type="GLintptr"/> >>> + <param name="size" type="GLsizeiptr"/> >>> + </function> >>> + >>> +</category> >>> + >>> <category name="GL_EXT_draw_elements_base_vertex" number="204"> >>> >>> <function name="DrawElementsBaseVertexEXT" >>> alias="DrawElementsBaseVertex" >>> @@ -919,6 +937,24 @@ >>> >>> </category> >>> >>> +<category name="GL_OES_texture_buffer" number="216"> >>> + >>> + <function name="TexBufferOES" es2="3.1" alias="TexBuffer"> >>> + <param name="target" type="GLenum"/> >>> + <param name="internalFormat" type="GLenum"/> >>> + <param name="buffer" type="GLuint"/> >>> + </function> >>> + >>> + <function name="TexBufferRangeOES" es2="3.1" alias="TexBufferRange"> >>> + <param name="target" type="GLenum"/> >>> + <param name="internalformat" type="GLenum"/> >>> + <param name="buffer" type="GLuint"/> >>> + <param name="offset" type="GLintptr"/> >>> + <param name="size" type="GLsizeiptr"/> >>> + </function> >>> + >>> +</category> >>> + >>> <category name="GL_OES_draw_elements_base_vertex" number="219"> >>> >>> <function name="DrawElementsBaseVertexOES" >>> alias="DrawElementsBaseVertex" >>> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c >>> index 9aec425..731b62e 100644 >>> --- a/src/mesa/main/bufferobj.c >>> +++ b/src/mesa/main/bufferobj.c >>> @@ -148,8 +148,8 @@ get_buffer_target(struct gl_context *ctx, GLenum target) >>> } >>> break; >>> case GL_TEXTURE_BUFFER: >>> - if (ctx->API == API_OPENGL_CORE && >>> - ctx->Extensions.ARB_texture_buffer_object) { >>> + if (_mesa_has_ARB_texture_buffer_object(ctx) || >>> + _mesa_has_OES_texture_buffer(ctx)) { >>> return &ctx->Texture.BufferObject; >>> } >>> break; >>> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c >>> index 1cbd692..6e04083 100644 >>> --- a/src/mesa/main/get.c >>> +++ b/src/mesa/main/get.c >>> @@ -1903,8 +1903,8 @@ tex_binding_to_index(const struct gl_context *ctx, >>> GLenum binding) >>> || _mesa_is_gles3(ctx) >>> ? TEXTURE_2D_ARRAY_INDEX : -1; >>> case GL_TEXTURE_BINDING_BUFFER: >>> - return ctx->API == API_OPENGL_CORE && >>> - ctx->Extensions.ARB_texture_buffer_object ? >>> + return (_mesa_has_ARB_texture_buffer_object(ctx) || >>> + _mesa_has_OES_texture_buffer(ctx)) ? >>> TEXTURE_BUFFER_INDEX : -1; >>> case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY: >>> return _mesa_is_desktop_gl(ctx) && >>> ctx->Extensions.ARB_texture_cube_map_array >>> diff --git a/src/mesa/main/get_hash_params.py >>> b/src/mesa/main/get_hash_params.py >>> index 0142285..d91e241 100644 >>> --- a/src/mesa/main/get_hash_params.py >>> +++ b/src/mesa/main/get_hash_params.py >>> @@ -538,6 +538,16 @@ descriptor=[ >>> >>> # GL_ARB_gpu_shader5 / GL_OES_geometry_shader >>> [ "MAX_GEOMETRY_SHADER_INVOCATIONS", >>> "CONST(MAX_GEOMETRY_SHADER_INVOCATIONS), >>> extra_ARB_gpu_shader5_or_oes_geometry_shader" ], >>> + >>> +# GL_ARB_texture_buffer_object / GL_OES_texture_buffer >>> + [ "MAX_TEXTURE_BUFFER_SIZE_ARB", >>> "CONTEXT_INT(Const.MaxTextureBufferSize), extra_texture_buffer_object" ], >>> + [ "TEXTURE_BINDING_BUFFER_ARB", "LOC_CUSTOM, TYPE_INT, 0, >>> extra_texture_buffer_object" ], >>> + [ "TEXTURE_BUFFER_DATA_STORE_BINDING_ARB", "LOC_CUSTOM, TYPE_INT, >>> TEXTURE_BUFFER_INDEX, extra_texture_buffer_object" ], >>> + [ "TEXTURE_BUFFER_FORMAT_ARB", "LOC_CUSTOM, TYPE_INT, 0, >>> extra_texture_buffer_object" ], >>> + [ "TEXTURE_BUFFER_ARB", "LOC_CUSTOM, TYPE_INT, 0, >>> extra_texture_buffer_object" ], >>> + >>> +# GL_ARB_texture_buffer_range >>> + [ "TEXTURE_BUFFER_OFFSET_ALIGNMENT", >>> "CONTEXT_INT(Const.TextureBufferOffsetAlignment), >>> extra_ARB_texture_buffer_range" ], >>> ]}, >>> >>> # Remaining enums are only in OpenGL >>> @@ -807,13 +817,6 @@ descriptor=[ >>> # GL_ARB_color_buffer_float >>> [ "RGBA_FLOAT_MODE_ARB", "BUFFER_FIELD(Visual.floatMode, TYPE_BOOLEAN), >>> extra_core_ARB_color_buffer_float_and_new_buffers" ], >>> >>> -# GL_ARB_texture_buffer_object >>> - [ "MAX_TEXTURE_BUFFER_SIZE_ARB", >>> "CONTEXT_INT(Const.MaxTextureBufferSize), extra_texture_buffer_object" ], >>> - [ "TEXTURE_BINDING_BUFFER_ARB", "LOC_CUSTOM, TYPE_INT, 0, >>> extra_texture_buffer_object" ], >>> - [ "TEXTURE_BUFFER_DATA_STORE_BINDING_ARB", "LOC_CUSTOM, TYPE_INT, >>> TEXTURE_BUFFER_INDEX, extra_texture_buffer_object" ], >>> - [ "TEXTURE_BUFFER_FORMAT_ARB", "LOC_CUSTOM, TYPE_INT, 0, >>> extra_texture_buffer_object" ], >>> - [ "TEXTURE_BUFFER_ARB", "LOC_CUSTOM, TYPE_INT, 0, >>> extra_texture_buffer_object" ], >>> - >>> # GL 3.0 >>> [ "CONTEXT_FLAGS", "CONTEXT_INT(Const.ContextFlags), extra_version_30" ], >>> >>> @@ -874,9 +877,6 @@ descriptor=[ >>> >>> # Enums restricted to OpenGL Core profile >>> { "apis": ["GL_CORE"], "params": [ >>> -# GL_ARB_texture_buffer_range >>> - [ "TEXTURE_BUFFER_OFFSET_ALIGNMENT", >>> "CONTEXT_INT(Const.TextureBufferOffsetAlignment), >>> extra_ARB_texture_buffer_range" ], >>> - >>> # GL_ARB_viewport_array >>> [ "MAX_VIEWPORTS", "CONTEXT_INT(Const.MaxViewports), >>> extra_ARB_viewport_array" ], >>> [ "VIEWPORT_SUBPIXEL_BITS", "CONTEXT_INT(Const.ViewportSubpixelBits), >>> extra_ARB_viewport_array" ], >>> diff --git a/src/mesa/main/tests/dispatch_sanity.cpp >>> b/src/mesa/main/tests/dispatch_sanity.cpp >>> index c323766..1a43a66 100644 >>> --- a/src/mesa/main/tests/dispatch_sanity.cpp >>> +++ b/src/mesa/main/tests/dispatch_sanity.cpp >>> @@ -2452,6 +2452,10 @@ const struct function gles3_functions_possible[] = { >>> /* GL_OES_sample_shading */ >>> { "glMinSampleShadingOES", 30, -1 }, >>> >>> + /* GL_OES_texture_buffer */ >>> + { "glTexBufferOES", 31, -1 }, >>> + { "glTexBufferRangeOES", 31, -1 }, >>> + >>> { NULL, 0, -1 } >>> }; >>> >>> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c >>> index 8a4c628..e0ede22 100644 >>> --- a/src/mesa/main/teximage.c >>> +++ b/src/mesa/main/teximage.c >>> @@ -481,8 +481,8 @@ _mesa_max_texture_levels(struct gl_context *ctx, GLenum >>> target) >>> return ctx->Extensions.ARB_texture_cube_map_array >>> ? ctx->Const.MaxCubeTextureLevels : 0; >>> case GL_TEXTURE_BUFFER: >>> - return ctx->API == API_OPENGL_CORE && >>> - ctx->Extensions.ARB_texture_buffer_object ? 1 : 0; >>> + return (_mesa_has_ARB_texture_buffer_object(ctx) || >>> + _mesa_has_OES_texture_buffer(ctx)) ? 1 : 0; >>> case GL_TEXTURE_2D_MULTISAMPLE: >>> case GL_PROXY_TEXTURE_2D_MULTISAMPLE: >>> case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: >>> @@ -4671,7 +4671,7 @@ _mesa_CompressedTextureSubImage3D(GLuint texture, >>> GLint level, GLint xoffset, >>> static mesa_format >>> get_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat) >>> { >>> - if (ctx->API != API_OPENGL_CORE) { >>> + if (ctx->API == API_OPENGL_COMPAT) { >>> switch (internalFormat) { >>> case GL_ALPHA8: >>> return MESA_FORMAT_A_UNORM8; >>> @@ -4758,8 +4758,8 @@ get_texbuffer_format(const struct gl_context *ctx, >>> GLenum internalFormat) >>> } >>> } >>> >>> - if (ctx->API == API_OPENGL_CORE && >>> - ctx->Extensions.ARB_texture_buffer_object_rgb32) { >>> + if (_mesa_has_ARB_texture_buffer_object_rgb32(ctx) || >>> + _mesa_has_OES_texture_buffer(ctx)) { >>> switch (internalFormat) { >>> case GL_RGB32F: >>> return MESA_FORMAT_RGB_FLOAT32; >>> @@ -4776,6 +4776,8 @@ get_texbuffer_format(const struct gl_context *ctx, >>> GLenum internalFormat) >>> case GL_RGBA8: >>> return MESA_FORMAT_R8G8B8A8_UNORM; >>> case GL_RGBA16: >>> + if (_mesa_is_gles(ctx)) >>> + return MESA_FORMAT_NONE; >>> return MESA_FORMAT_RGBA_UNORM16; >>> case GL_RGBA16F_ARB: >>> return MESA_FORMAT_RGBA_FLOAT16; >>> @@ -4797,6 +4799,8 @@ get_texbuffer_format(const struct gl_context *ctx, >>> GLenum internalFormat) >>> case GL_RG8: >>> return MESA_FORMAT_R8G8_UNORM; >>> case GL_RG16: >>> + if (_mesa_is_gles(ctx)) >>> + return MESA_FORMAT_NONE; >>> return MESA_FORMAT_R16G16_UNORM; >>> case GL_RG16F: >>> return MESA_FORMAT_RG_FLOAT16; >>> @@ -4818,6 +4822,8 @@ get_texbuffer_format(const struct gl_context *ctx, >>> GLenum internalFormat) >>> case GL_R8: >>> return MESA_FORMAT_R_UNORM8; >>> case GL_R16: >>> + if (_mesa_is_gles(ctx)) >>> + return MESA_FORMAT_NONE; >>> return MESA_FORMAT_R_UNORM16; >>> case GL_R16F: >>> return MESA_FORMAT_R_FLOAT16; >>> @@ -4895,8 +4901,8 @@ _mesa_texture_buffer_range(struct gl_context *ctx, >>> /* NOTE: ARB_texture_buffer_object has interactions with >>> * the compatibility profile that are not implemented. >>> */ >>> - if (!(ctx->API == API_OPENGL_CORE && >>> - ctx->Extensions.ARB_texture_buffer_object)) { >>> + if (!_mesa_has_ARB_texture_buffer_object(ctx) && >>> + !_mesa_has_OES_texture_buffer(ctx)) { >>> _mesa_error(ctx, GL_INVALID_OPERATION, >>> "%s(ARB_texture_buffer_object is not" >>> " implemented for the compatibility profile)", caller); >>> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c >>> index d8407f0..c9502bd 100644 >>> --- a/src/mesa/main/texobj.c >>> +++ b/src/mesa/main/texobj.c >>> @@ -204,8 +204,8 @@ _mesa_get_current_tex_object(struct gl_context *ctx, >>> GLenum target) >>> case GL_PROXY_TEXTURE_2D_ARRAY_EXT: >>> return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_2D_ARRAY_INDEX] : >>> NULL; >>> case GL_TEXTURE_BUFFER: >>> - return ctx->API == API_OPENGL_CORE && >>> - ctx->Extensions.ARB_texture_buffer_object ? >>> + return (_mesa_has_ARB_texture_buffer_object(ctx) || >>> + _mesa_has_OES_texture_buffer(ctx)) ? >>> texUnit->CurrentTex[TEXTURE_BUFFER_INDEX] : NULL; >>> case GL_TEXTURE_EXTERNAL_OES: >>> return _mesa_is_gles(ctx) && >>> ctx->Extensions.OES_EGL_image_external >>> @@ -1574,8 +1574,8 @@ _mesa_tex_target_to_index(const struct gl_context >>> *ctx, GLenum target) >>> || _mesa_is_gles3(ctx) >>> ? TEXTURE_2D_ARRAY_INDEX : -1; >>> case GL_TEXTURE_BUFFER: >>> - return ctx->API == API_OPENGL_CORE && >>> - ctx->Extensions.ARB_texture_buffer_object ? >>> + return (_mesa_has_ARB_texture_buffer_object(ctx) || >>> + _mesa_has_OES_texture_buffer(ctx)) ? >>> TEXTURE_BUFFER_INDEX : -1; >>> case GL_TEXTURE_EXTERNAL_OES: >>> return _mesa_is_gles(ctx) && ctx->Extensions.OES_EGL_image_external >>> diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c >>> index 9d94636..0c3429f 100644 >>> --- a/src/mesa/main/texparam.c >>> +++ b/src/mesa/main/texparam.c >>> @@ -1223,6 +1223,26 @@ legal_get_tex_level_parameter_target(struct >>> gl_context *ctx, GLenum target, >>> case GL_TEXTURE_2D_MULTISAMPLE: >>> case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: >>> return ctx->Extensions.ARB_texture_multisample; >>> + case GL_TEXTURE_BUFFER: >>> + /* GetTexLevelParameter accepts GL_TEXTURE_BUFFER in GL 3.1+ >>> contexts, >>> + * but not in earlier versions that expose ARB_texture_buffer_object. >>> + * >>> + * From the ARB_texture_buffer_object spec: >>> + * "(7) Do buffer textures support texture parameters (TexParameter) >>> or >>> + * queries (GetTexParameter, GetTexLevelParameter, GetTexImage)? >>> + * >>> + * RESOLVED: No. [...] Note that the spec edits above don't add >>> + * explicit error language for any of these cases. That is >>> because >>> + * each of the functions enumerate the set of valid <target> >>> + * parameters. Not editing the spec to allow TEXTURE_BUFFER_ARB >>> in >>> + * these cases means that target is not legal, and an INVALID_ENUM >>> + * error should be generated." >>> + * >>> + * From the OpenGL 3.1 spec: >>> + * "target may also be TEXTURE_BUFFER, indicating the texture >>> buffer." >>> + */ >>> + return _mesa_has_ARB_texture_buffer_object(ctx) || >> >> Er oops, I meant to undo this change -- this should be >> >> return (ctx->API == API_OPENGL_CORE && ctx->Version >= 31) || >> _mesa_has_OES_texture_buffer(ctx); > > I think this actually fine... but maybe the code should document the > reason. We only expose GL_ARB_texture_buffer_object in either a > forward-compatible or core profile context. In order to have core > profile, you must already have 3.1+. In order to have > forward-compatible, the application has to opt-in (and I don't think > *any* application does), and I don't care if we allow some tiny extra > bit beyond the spec. ;)
It's admittedly a little hypothetical, but this logic is mainly preventing glGetTex*Parameter on texture buffers for non-core contexts. In my zeal to clean things up, I had accidentally undone it. Mostly I just don't want to unnecessarily modify behavior that was there for what I assume were good reasons. Perhaps there's a future where tbo will be supported in compat contexts? I didn't want to make that prospect harder to implement. > >>> + _mesa_has_OES_texture_buffer(ctx); >>> } >>> >>> if (!_mesa_is_desktop_gl(ctx)) >>> @@ -1247,25 +1267,6 @@ legal_get_tex_level_parameter_target(struct >>> gl_context *ctx, GLenum target, >>> case GL_PROXY_TEXTURE_1D_ARRAY_EXT: >>> case GL_PROXY_TEXTURE_2D_ARRAY_EXT: >>> return ctx->Extensions.EXT_texture_array; >>> - case GL_TEXTURE_BUFFER: >>> - /* GetTexLevelParameter accepts GL_TEXTURE_BUFFER in GL 3.1+ >>> contexts, >>> - * but not in earlier versions that expose ARB_texture_buffer_object. >>> - * >>> - * From the ARB_texture_buffer_object spec: >>> - * "(7) Do buffer textures support texture parameters (TexParameter) >>> or >>> - * queries (GetTexParameter, GetTexLevelParameter, GetTexImage)? >>> - * >>> - * RESOLVED: No. [...] Note that the spec edits above don't add >>> - * explicit error language for any of these cases. That is >>> because >>> - * each of the functions enumerate the set of valid <target> >>> - * parameters. Not editing the spec to allow TEXTURE_BUFFER_ARB >>> in >>> - * these cases means that target is not legal, and an INVALID_ENUM >>> - * error should be generated." >>> - * >>> - * From the OpenGL 3.1 spec: >>> - * "target may also be TEXTURE_BUFFER, indicating the texture >>> buffer." >>> - */ >>> - return ctx->API == API_OPENGL_CORE && ctx->Version >= 31; >>> case GL_PROXY_TEXTURE_2D_MULTISAMPLE: >>> case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY: >>> return ctx->Extensions.ARB_texture_multisample; >>> -- >>> 2.4.10 >>> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/mesa-dev >> > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev