Texture Rectangle implementation
This adds support for GL_ARB_texture_rectangle, as it is used in Chromium.
This is required in order to use EGL/GLES on MacOS using IOSurface,
in order to be able to run Chromium on top of SwiftShader on MacOS.
Change-Id: I3c0b6a137892583bbfbc68149874d5bec3026b4a
Reviewed-on: https://swiftshader-review.googlesource.com/16368
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 6db0a79..aa743e7 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -389,6 +389,9 @@
case GL_TEXTURE_3D:
context->bindTexture3D(texture);
break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ context->bindTexture2DRect(texture);
+ break;
default:
return error(GL_INVALID_ENUM);
}
@@ -836,6 +839,7 @@
switch(target)
{
case GL_TEXTURE_2D:
+ case GL_TEXTURE_RECTANGLE_ARB:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
@@ -868,9 +872,9 @@
return error(GL_INVALID_VALUE);
}
- if(target == GL_TEXTURE_2D)
+ if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
{
- es2::Texture2D *texture = context->getTexture2D();
+ es2::Texture2D *texture = context->getTexture2D(target);
if(!texture)
{
@@ -958,9 +962,9 @@
GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_NONE);
- if(target == GL_TEXTURE_2D)
+ if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
{
- es2::Texture2D *texture = context->getTexture2D();
+ es2::Texture2D *texture = context->getTexture2D(target);
GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture, context->getClientVersion());
if(validationError != GL_NONE)
@@ -1021,6 +1025,7 @@
switch(target)
{
case GL_TEXTURE_2D:
+ case GL_TEXTURE_RECTANGLE_ARB:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
@@ -1069,9 +1074,9 @@
return;
}
- if(target == GL_TEXTURE_2D)
+ if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
{
- es2::Texture2D *texture = context->getTexture2D();
+ es2::Texture2D *texture = context->getTexture2D(target);
if(!texture)
{
@@ -1141,9 +1146,9 @@
es2::Texture *texture = nullptr;
- if(target == GL_TEXTURE_2D)
+ if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
{
- texture = context->getTexture2D();
+ texture = context->getTexture2D(target);
}
else if(es2::IsCubemapTextureTarget(target))
{
@@ -2097,6 +2102,12 @@
return error(GL_INVALID_OPERATION);
}
break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ if(tex->getTarget() != GL_TEXTURE_RECTANGLE_ARB)
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+ break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
@@ -2285,6 +2296,9 @@
case GL_TEXTURE_3D:
texture = context->getTexture3D();
break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ texture = context->getTexture2DRect();
+ break;
default:
return error(GL_INVALID_ENUM);
}
@@ -3588,6 +3602,9 @@
case GL_TEXTURE_3D:
texture = context->getTexture3D();
break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ texture = context->getTexture2DRect();
+ break;
default:
return error(GL_INVALID_ENUM);
}
@@ -3741,6 +3758,9 @@
case GL_TEXTURE_3D:
texture = context->getTexture3D();
break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ texture = context->getTexture2DRect();
+ break;
default:
return error(GL_INVALID_ENUM);
}
@@ -5042,6 +5062,7 @@
switch(target)
{
case GL_TEXTURE_2D:
+ case GL_TEXTURE_RECTANGLE_ARB:
if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
{
@@ -5077,9 +5098,9 @@
return error(validationError);
}
- if(target == GL_TEXTURE_2D)
+ if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
{
- es2::Texture2D *texture = context->getTexture2D();
+ es2::Texture2D *texture = context->getTexture2D(target);
if(!texture)
{
@@ -5138,6 +5159,9 @@
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ texture = context->getTexture2DRect();
+ break;
default:
return error(GL_INVALID_ENUM);
}
@@ -5287,6 +5311,9 @@
case GL_TEXTURE_EXTERNAL_OES:
texture = context->getTextureExternal();
break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ texture = context->getTexture2DRect();
+ break;
default:
return error(GL_INVALID_ENUM);
}
@@ -5432,9 +5459,9 @@
if(context)
{
- if(target == GL_TEXTURE_2D)
+ if(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB)
{
- es2::Texture2D *texture = context->getTexture2D();
+ es2::Texture2D *texture = context->getTexture2D(target);
GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture, context->getClientVersion());
if(validationError != GL_NONE)
@@ -6676,6 +6703,7 @@
switch(target)
{
case GL_TEXTURE_2D:
+ case GL_TEXTURE_RECTANGLE_ARB:
case GL_TEXTURE_EXTERNAL_OES:
break;
default:
@@ -6686,14 +6714,7 @@
if(context)
{
- es2::Texture2D *texture = nullptr;
-
- switch(target)
- {
- case GL_TEXTURE_2D: texture = context->getTexture2D(); break;
- case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
- default: UNREACHABLE(target);
- }
+ es2::Texture2D *texture = context->getTexture2D(target);
if(!texture)
{