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()
eglImage(false),
eglImageExternal(false),
eglImageExternalEssl3(false),
unpackSubimage(false),
packSubimage(false),
colorBufferFloat(false)
{
}
......@@ -195,6 +197,8 @@ std::vector<std::string> Extensions::getStrings() const
InsertExtensionString("GL_OES_EGL_image", eglImage, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image_external", eglImageExternal, &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);
// clang-format on
......
......@@ -228,6 +228,12 @@ struct Extensions
// GL_OES_EGL_image_external_essl3
bool eglImageExternalEssl3;
// EXT_unpack_subimage
bool unpackSubimage;
// NV_pack_subimage
bool packSubimage;
// ES3 Extension support
// GL_EXT_color_buffer_float
......
......@@ -1094,6 +1094,26 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
}
}
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:
{
*type = GL_INT;
......@@ -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_SEPARATE_ATTRIBS:
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;
*numParams = 1;
......
......@@ -538,6 +538,12 @@ void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsM
functions->hasGLExtension("GL_EXT_draw_instanced"))) ||
functions->isAtLeastGLES(gl::Version(3, 0)) ||
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)
......
......@@ -3082,14 +3082,28 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
{
case GL_UNPACK_IMAGE_HEIGHT:
case GL_UNPACK_SKIP_IMAGES:
context->recordError(Error(GL_INVALID_ENUM));
return;
case GL_UNPACK_ROW_LENGTH:
case GL_UNPACK_SKIP_ROWS:
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_SKIP_ROWS:
case GL_PACK_SKIP_PIXELS:
context->recordError(Error(GL_INVALID_ENUM));
return;
if (!context->getExtensions().packSubimage)
{
context->recordError(Error(GL_INVALID_ENUM));
return;
}
break;
}
}
......@@ -3128,7 +3142,7 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
break;
case GL_UNPACK_ROW_LENGTH:
ASSERT(context->getClientVersion() >= 3);
ASSERT((context->getClientVersion() >= 3) || context->getExtensions().unpackSubimage);
state.setUnpackRowLength(param);
break;
......@@ -3143,27 +3157,27 @@ void GL_APIENTRY PixelStorei(GLenum pname, GLint param)
break;
case GL_UNPACK_SKIP_ROWS:
ASSERT(context->getClientVersion() >= 3);
ASSERT((context->getClientVersion() >= 3) || context->getExtensions().unpackSubimage);
state.getUnpackState().skipRows = param;
break;
case GL_UNPACK_SKIP_PIXELS:
ASSERT(context->getClientVersion() >= 3);
ASSERT((context->getClientVersion() >= 3) || context->getExtensions().unpackSubimage);
state.getUnpackState().skipPixels = param;
break;
case GL_PACK_ROW_LENGTH:
ASSERT(context->getClientVersion() >= 3);
ASSERT((context->getClientVersion() >= 3) || context->getExtensions().packSubimage);
state.getPackState().rowLength = param;
break;
case GL_PACK_SKIP_ROWS:
ASSERT(context->getClientVersion() >= 3);
ASSERT((context->getClientVersion() >= 3) || context->getExtensions().packSubimage);
state.getPackState().skipRows = param;
break;
case GL_PACK_SKIP_PIXELS:
ASSERT(context->getClientVersion() >= 3);
ASSERT((context->getClientVersion() >= 3) || context->getExtensions().packSubimage);
state.getPackState().skipPixels = param;
break;
......
......@@ -70,7 +70,7 @@ class UnpackRowLengthTest : public ANGLETest
{
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.
// If the UNPACK_ROW_LENGTH is implemented correctly, all texels inside this texture are WHITE.
......@@ -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.
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
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