Implement GL_OES_fbo_render_mipmap. This enables binding any texture mipmap level as a framebuffer attachment. Bug swiftshader:104 Change-Id: I3d4ea637ddd38bb62ca1363fe2c69c569eea36e9 Reviewed-on: https://swiftshader-review.googlesource.com/18008 Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Lingfeng Yang <lfy@google.com> Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index 5a5a6b3..e257174 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -4405,6 +4405,7 @@ "GL_OES_EGL_image_external", "GL_OES_EGL_sync", "GL_OES_element_index_uint", + "GL_OES_fbo_render_mipmap", "GL_OES_framebuffer_object", "GL_OES_packed_depth_stencil", "GL_OES_rgb8_rgba8",
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp index a970dcf..fdbb617 100644 --- a/src/OpenGL/libGLESv2/Renderbuffer.cpp +++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -78,7 +78,7 @@ RenderbufferTexture2D::~RenderbufferTexture2D() { - mTexture2D = NULL; + mTexture2D = nullptr; } // Textures need to maintain their own reference count for references via @@ -441,7 +441,7 @@ void Renderbuffer::setStorage(RenderbufferStorage *newStorage) { - ASSERT(newStorage != NULL); + ASSERT(newStorage); delete mInstance; mInstance = newStorage;
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp index 1577569..4be1261 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.cpp +++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -6006,11 +6006,6 @@ return error(GL_INVALID_OPERATION); } - if(tex->isCompressed(textarget, level)) - { - return error(GL_INVALID_OPERATION); - } - switch(textarget) { case GL_TEXTURE_3D: @@ -6023,10 +6018,15 @@ return error(GL_INVALID_ENUM); } - if(level != 0) + if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)) { return error(GL_INVALID_VALUE); } + + if(tex->isCompressed(textarget, level)) + { + return error(GL_INVALID_OPERATION); + } } es2::Framebuffer *framebuffer = nullptr; @@ -6049,14 +6049,14 @@ switch(attachment) { - case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break; - case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break; + case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level); break; + case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level); break; default: if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS) { return error(GL_INVALID_ENUM); } - framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0); + framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level); break; } }