Commit eb5ea077 by Minmin Gong Committed by Geoff Lang

Implements GL_EXT_unpack_subimage and GL_NV_pack_subimage.

Pack/unpack subimages is core features of GLES3. Those 2 extensions expose them to GLES2. BUG=angleproject:512 Change-Id: I6834cf5d4a91bc3430c60dcec29c449826fd6d93 Reviewed-on: https://chromium-review.googlesource.com/299790Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarMinmin Gong <mgong@microsoft.com>
parent 7a041518
...@@ -139,6 +139,8 @@ Extensions::Extensions() ...@@ -139,6 +139,8 @@ Extensions::Extensions()
eglImage(false), eglImage(false),
eglImageExternal(false), eglImageExternal(false),
eglImageExternalEssl3(false), eglImageExternalEssl3(false),
unpackSubimage(false),
packSubimage(false),
colorBufferFloat(false) colorBufferFloat(false)
{ {
} }
...@@ -195,6 +197,8 @@ std::vector<std::string> Extensions::getStrings() const ...@@ -195,6 +197,8 @@ std::vector<std::string> Extensions::getStrings() const
InsertExtensionString("GL_OES_EGL_image", eglImage, &extensionStrings); InsertExtensionString("GL_OES_EGL_image", eglImage, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image_external", eglImageExternal, &extensionStrings); InsertExtensionString("GL_OES_EGL_image_external", eglImageExternal, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image_external_essl3", eglImageExternalEssl3, &extensionStrings); InsertExtensionString("GL_OES_EGL_image_external_essl3", eglImageExternalEssl3, &extensionStrings);
InsertExtensionString("GL_EXT_unpack_subimage", unpackSubimage, &extensionStrings);
InsertExtensionString("GL_NV_pack_subimage", packSubimage, &extensionStrings);
InsertExtensionString("GL_EXT_color_buffer_float", colorBufferFloat, &extensionStrings); InsertExtensionString("GL_EXT_color_buffer_float", colorBufferFloat, &extensionStrings);
// clang-format on // clang-format on
......
...@@ -228,6 +228,12 @@ struct Extensions ...@@ -228,6 +228,12 @@ struct Extensions
// GL_OES_EGL_image_external_essl3 // GL_OES_EGL_image_external_essl3
bool eglImageExternalEssl3; bool eglImageExternalEssl3;
// EXT_unpack_subimage
bool unpackSubimage;
// NV_pack_subimage
bool packSubimage;
// ES3 Extension support // ES3 Extension support
// GL_EXT_color_buffer_float // GL_EXT_color_buffer_float
......
...@@ -1094,6 +1094,26 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu ...@@ -1094,6 +1094,26 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
} }
} }
return true; return true;
case GL_PACK_ROW_LENGTH:
case GL_PACK_SKIP_ROWS:
case GL_PACK_SKIP_PIXELS:
if (!mExtensions.packSubimage)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_UNPACK_ROW_LENGTH:
case GL_UNPACK_SKIP_ROWS:
case GL_UNPACK_SKIP_PIXELS:
if (!mExtensions.unpackSubimage)
{
return false;
}
*type = GL_INT;
*numParams = 1;
return true;
case GL_MAX_VIEWPORT_DIMS: case GL_MAX_VIEWPORT_DIMS:
{ {
*type = GL_INT; *type = GL_INT;
...@@ -1204,6 +1224,12 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu ...@@ -1204,6 +1224,12 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
case GL_PACK_ROW_LENGTH:
case GL_PACK_SKIP_ROWS:
case GL_PACK_SKIP_PIXELS:
case GL_UNPACK_ROW_LENGTH:
case GL_UNPACK_SKIP_ROWS:
case GL_UNPACK_SKIP_PIXELS:
{ {
*type = GL_INT; *type = GL_INT;
*numParams = 1; *numParams = 1;
......
...@@ -538,6 +538,12 @@ void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsM ...@@ -538,6 +538,12 @@ void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsM
functions->hasGLExtension("GL_EXT_draw_instanced"))) || functions->hasGLExtension("GL_EXT_draw_instanced"))) ||
functions->isAtLeastGLES(gl::Version(3, 0)) || functions->isAtLeastGLES(gl::Version(3, 0)) ||
functions->hasGLESExtension("GL_EXT_instanced_arrays"); functions->hasGLESExtension("GL_EXT_instanced_arrays");
extensions->unpackSubimage = functions->standard == STANDARD_GL_DESKTOP ||
functions->isAtLeastGLES(gl::Version(3, 0)) ||
functions->hasGLESExtension("GL_EXT_unpack_subimage");
extensions->packSubimage = functions->standard == STANDARD_GL_DESKTOP ||
functions->isAtLeastGLES(gl::Version(3, 0)) ||
functions->hasGLESExtension("GL_NV_pack_subimage");
} }
void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workarounds) void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workarounds)
......
...@@ -3082,14 +3082,28 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param) ...@@ -3082,14 +3082,28 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
{ {
case GL_UNPACK_IMAGE_HEIGHT: case GL_UNPACK_IMAGE_HEIGHT:
case GL_UNPACK_SKIP_IMAGES: case GL_UNPACK_SKIP_IMAGES:
context->recordError(Error(GL_INVALID_ENUM));
return;
case GL_UNPACK_ROW_LENGTH: case GL_UNPACK_ROW_LENGTH:
case GL_UNPACK_SKIP_ROWS: case GL_UNPACK_SKIP_ROWS:
case GL_UNPACK_SKIP_PIXELS: case GL_UNPACK_SKIP_PIXELS:
if (!context->getExtensions().unpackSubimage)
{
context->recordError(Error(GL_INVALID_ENUM));
return;
}
break;
case GL_PACK_ROW_LENGTH: case GL_PACK_ROW_LENGTH:
case GL_PACK_SKIP_ROWS: case GL_PACK_SKIP_ROWS:
case GL_PACK_SKIP_PIXELS: case GL_PACK_SKIP_PIXELS:
context->recordError(Error(GL_INVALID_ENUM)); if (!context->getExtensions().packSubimage)
return; {
context->recordError(Error(GL_INVALID_ENUM));
return;
}
break;
} }
} }
...@@ -3128,7 +3142,7 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param) ...@@ -3128,7 +3142,7 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
break; break;
case GL_UNPACK_ROW_LENGTH: case GL_UNPACK_ROW_LENGTH:
ASSERT(context->getClientVersion() >= 3); ASSERT((context->getClientVersion() >= 3) || context->getExtensions().unpackSubimage);
state.setUnpackRowLength(param); state.setUnpackRowLength(param);
break; break;
...@@ -3143,27 +3157,27 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param) ...@@ -3143,27 +3157,27 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
break; break;
case GL_UNPACK_SKIP_ROWS: case GL_UNPACK_SKIP_ROWS:
ASSERT(context->getClientVersion() >= 3); ASSERT((context->getClientVersion() >= 3) || context->getExtensions().unpackSubimage);
state.getUnpackState().skipRows = param; state.getUnpackState().skipRows = param;
break; break;
case GL_UNPACK_SKIP_PIXELS: case GL_UNPACK_SKIP_PIXELS:
ASSERT(context->getClientVersion() >= 3); ASSERT((context->getClientVersion() >= 3) || context->getExtensions().unpackSubimage);
state.getUnpackState().skipPixels = param; state.getUnpackState().skipPixels = param;
break; break;
case GL_PACK_ROW_LENGTH: case GL_PACK_ROW_LENGTH:
ASSERT(context->getClientVersion() >= 3); ASSERT((context->getClientVersion() >= 3) || context->getExtensions().packSubimage);
state.getPackState().rowLength = param; state.getPackState().rowLength = param;
break; break;
case GL_PACK_SKIP_ROWS: case GL_PACK_SKIP_ROWS:
ASSERT(context->getClientVersion() >= 3); ASSERT((context->getClientVersion() >= 3) || context->getExtensions().packSubimage);
state.getPackState().skipRows = param; state.getPackState().skipRows = param;
break; break;
case GL_PACK_SKIP_PIXELS: case GL_PACK_SKIP_PIXELS:
ASSERT(context->getClientVersion() >= 3); ASSERT((context->getClientVersion() >= 3) || context->getExtensions().packSubimage);
state.getPackState().skipPixels = param; state.getPackState().skipPixels = param;
break; break;
......
...@@ -70,7 +70,7 @@ class UnpackRowLengthTest : public ANGLETest ...@@ -70,7 +70,7 @@ class UnpackRowLengthTest : public ANGLETest
{ {
glPixelStorei(GL_UNPACK_ROW_LENGTH, rowLength); glPixelStorei(GL_UNPACK_ROW_LENGTH, rowLength);
if (getClientVersion() == 3) if ((getClientVersion() == 3) || extensionEnabled("GL_EXT_unpack_subimage"))
{ {
// Only texSize * texSize region is filled as WHITE, other parts are BLACK. // Only texSize * texSize region is filled as WHITE, other parts are BLACK.
// If the UNPACK_ROW_LENGTH is implemented correctly, all texels inside this texture are WHITE. // If the UNPACK_ROW_LENGTH is implemented correctly, all texels inside this texture are WHITE.
...@@ -118,6 +118,11 @@ TEST_P(UnpackRowLengthTest, RowLength1024) ...@@ -118,6 +118,11 @@ TEST_P(UnpackRowLengthTest, RowLength1024)
} }
// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
ANGLE_INSTANTIATE_TEST(UnpackRowLengthTest, ES3_D3D11(), ES2_D3D11(), ES2_OPENGL(), ES3_OPENGL()); ANGLE_INSTANTIATE_TEST(UnpackRowLengthTest,
ES3_D3D11(),
ES2_D3D11(),
ES2_D3D9(),
ES2_OPENGL(),
ES3_OPENGL());
} // namespace } // namespace
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment