mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 22:38:05 +02:00
mesa: Fix texture target validation for glFramebufferTexture()
Previously we were using the code path for validating
glFramebufferTextureLayer(). But glFramebufferTexture() allows
additional texture types.
Fixes piglit tests:
- spec/!OpenGL 3.2/layered-rendering/gl-layer-cube-map
- spec/!OpenGL 3.2/layered-rendering/framebuffertexture
Cc: "10.0" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
v2: Clarify comment above framebuffer_texture().
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
(cherry picked from commit af1471dc04)
This commit is contained in:
parent
79d727e063
commit
8f4d95d41c
1 changed files with 47 additions and 12 deletions
|
|
@ -2307,8 +2307,13 @@ reuse_framebuffer_texture_attachment(struct gl_framebuffer *fb,
|
|||
/**
|
||||
* Common code called by glFramebufferTexture1D/2D/3DEXT() and
|
||||
* glFramebufferTextureLayerEXT().
|
||||
* Note: glFramebufferTextureLayerEXT() has no textarget parameter so we'll
|
||||
* get textarget=0 in that case.
|
||||
*
|
||||
* \param textarget is the textarget that was passed to the
|
||||
* glFramebufferTexture...() function, or 0 if the corresponding function
|
||||
* doesn't have a textarget parameter.
|
||||
*
|
||||
* \param layered is true if this function was called from
|
||||
* glFramebufferTexture(), false otherwise.
|
||||
*/
|
||||
static void
|
||||
framebuffer_texture(struct gl_context *ctx, const char *caller, GLenum target,
|
||||
|
|
@ -2343,16 +2348,46 @@ framebuffer_texture(struct gl_context *ctx, const char *caller, GLenum target,
|
|||
texObj = _mesa_lookup_texture(ctx, texture);
|
||||
if (texObj != NULL) {
|
||||
if (textarget == 0) {
|
||||
/* If textarget == 0 it means we're being called by
|
||||
* glFramebufferTextureLayer() and textarget is not used.
|
||||
* The only legal texture types for that function are 3D and
|
||||
* 1D/2D arrays textures.
|
||||
*/
|
||||
err = (texObj->Target != GL_TEXTURE_3D) &&
|
||||
(texObj->Target != GL_TEXTURE_1D_ARRAY_EXT) &&
|
||||
(texObj->Target != GL_TEXTURE_2D_ARRAY_EXT) &&
|
||||
(texObj->Target != GL_TEXTURE_CUBE_MAP_ARRAY) &&
|
||||
(texObj->Target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
|
||||
if (layered) {
|
||||
/* We're being called by glFramebufferTexture() and textarget
|
||||
* is not used.
|
||||
*/
|
||||
switch (texObj->Target) {
|
||||
case GL_TEXTURE_3D:
|
||||
case GL_TEXTURE_1D_ARRAY_EXT:
|
||||
case GL_TEXTURE_2D_ARRAY_EXT:
|
||||
case GL_TEXTURE_CUBE_MAP:
|
||||
case GL_TEXTURE_CUBE_MAP_ARRAY:
|
||||
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
|
||||
err = false;
|
||||
break;
|
||||
case GL_TEXTURE_1D:
|
||||
case GL_TEXTURE_2D:
|
||||
case GL_TEXTURE_RECTANGLE:
|
||||
case GL_TEXTURE_2D_MULTISAMPLE:
|
||||
/* These texture types are valid to pass to
|
||||
* glFramebufferTexture(), but since they aren't layered, it
|
||||
* is equivalent to calling glFramebufferTexture{1D,2D}().
|
||||
*/
|
||||
err = false;
|
||||
layered = false;
|
||||
textarget = texObj->Target;
|
||||
break;
|
||||
default:
|
||||
err = true;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* We're being called by glFramebufferTextureLayer() and
|
||||
* textarget is not used. The only legal texture types for
|
||||
* that function are 3D and 1D/2D arrays textures.
|
||||
*/
|
||||
err = (texObj->Target != GL_TEXTURE_3D) &&
|
||||
(texObj->Target != GL_TEXTURE_1D_ARRAY_EXT) &&
|
||||
(texObj->Target != GL_TEXTURE_2D_ARRAY_EXT) &&
|
||||
(texObj->Target != GL_TEXTURE_CUBE_MAP_ARRAY) &&
|
||||
(texObj->Target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Make sure textarget is consistent with the texture's type */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue