You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
647 lines
26 KiB
647 lines
26 KiB
/*------------------------------------------------------------------------- |
|
* drawElements Quality Program OpenGL ES 2.0 Module |
|
* ------------------------------------------------- |
|
* |
|
* Copyright 2014 The Android Open Source Project |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* |
|
*//*! |
|
* \file |
|
* \brief Framebuffer Object API Tests. |
|
* |
|
* Notes: |
|
* All gl calls are passed thru sgl2::Context class. Reasons: |
|
* + Name, object allocation is tracked and live resources are freed |
|
* when Context is destroyed. |
|
* + Makes it possible to easily log all relevant calls into test log. |
|
* \todo [pyry] This is not implemented yet |
|
*//*--------------------------------------------------------------------*/ |
|
|
|
#include "es2fFboApiTest.hpp" |
|
#include "sglrGLContext.hpp" |
|
#include "gluDefs.hpp" |
|
#include "gluContextInfo.hpp" |
|
#include "gluStrUtil.hpp" |
|
#include "tcuRenderTarget.hpp" |
|
#include "deString.h" |
|
#include "glwFunctions.hpp" |
|
#include "glwEnums.hpp" |
|
|
|
#include <iterator> |
|
#include <algorithm> |
|
|
|
namespace deqp |
|
{ |
|
namespace gles2 |
|
{ |
|
namespace Functional |
|
{ |
|
|
|
using std::string; |
|
using std::vector; |
|
using tcu::TestLog; |
|
|
|
using glw::GLenum; |
|
using glw::GLint; |
|
|
|
static void logComment (tcu::TestContext& testCtx, const char* comment) |
|
{ |
|
testCtx.getLog() << TestLog::Message << "// " << comment << TestLog::EndMessage; |
|
} |
|
|
|
static void checkError (tcu::TestContext& testCtx, sglr::Context& ctx, GLenum expect) |
|
{ |
|
GLenum result = ctx.getError(); |
|
testCtx.getLog() << TestLog::Message << "// " << (result == expect ? "Pass" : "Fail") << ", expected " << glu::getErrorStr(expect) << TestLog::EndMessage; |
|
|
|
if (result != expect) |
|
testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error code mismatch"); |
|
} |
|
|
|
static void checkEitherError (tcu::TestContext& testCtx, sglr::Context& ctx, GLenum expectA, GLenum expectB) |
|
{ |
|
GLenum result = ctx.getError(); |
|
bool isOk = (result == expectA || result == expectB); |
|
|
|
testCtx.getLog() << TestLog::Message << "// " << (isOk ? "Pass" : "Fail") << ", expected " << glu::getErrorStr(expectA) << " or " << glu::getErrorStr(expectB) << TestLog::EndMessage; |
|
|
|
if (!isOk) |
|
testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error code mismatch"); |
|
} |
|
|
|
static const char* getAttachmentName (GLenum attachment) |
|
{ |
|
switch (attachment) |
|
{ |
|
case GL_COLOR_ATTACHMENT0: return "GL_COLOR_ATTACHMENT0"; |
|
case GL_DEPTH_ATTACHMENT: return "GL_DEPTH_ATTACHMENT"; |
|
case GL_STENCIL_ATTACHMENT: return "GL_STENCIL_ATTACHMENT"; |
|
default: throw tcu::InternalError("Unknown attachment", "", __FILE__, __LINE__); |
|
} |
|
} |
|
|
|
static const char* getAttachmentParameterName (GLenum pname) |
|
{ |
|
switch (pname) |
|
{ |
|
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: return "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"; |
|
case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: return "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"; |
|
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: return "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"; |
|
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: return "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"; |
|
default: throw tcu::InternalError("Unknown parameter", "", __FILE__, __LINE__); |
|
} |
|
} |
|
|
|
static string getAttachmentParameterValueName (GLint value) |
|
{ |
|
switch (value) |
|
{ |
|
case 0: return "GL_NONE(0)"; |
|
case GL_TEXTURE: return "GL_TEXTURE"; |
|
case GL_RENDERBUFFER: return "GL_RENDERBUFFER"; |
|
case GL_TEXTURE_CUBE_MAP_POSITIVE_X: return "GL_TEXTURE_CUBE_MAP_POSITIVE_X"; |
|
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: return "GL_TEXTURE_CUBE_MAP_NEGATIVE_X"; |
|
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: return "GL_TEXTURE_CUBE_MAP_POSITIVE_Y"; |
|
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"; |
|
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: return "GL_TEXTURE_CUBE_MAP_POSITIVE_Z"; |
|
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"; |
|
default: |
|
{ |
|
char tmp[64]; |
|
deSprintf(tmp, sizeof(tmp), "0x%x", value); |
|
return string(tmp); |
|
} |
|
} |
|
} |
|
|
|
static void checkFboAttachmentParam (tcu::TestContext& testCtx, sglr::Context& ctx, GLenum attachment, GLenum pname, GLint expectedValue) |
|
{ |
|
TestLog& log = testCtx.getLog(); |
|
log << TestLog::Message << "// Querying " << getAttachmentName(attachment) << " " << getAttachmentParameterName(pname) << TestLog::EndMessage; |
|
|
|
GLint value = 0xcdcdcdcd; |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, attachment, pname, &value); |
|
|
|
GLenum err = ctx.getError(); |
|
|
|
if (value == expectedValue && err == GL_NO_ERROR) |
|
log << TestLog::Message << "// Pass" << TestLog::EndMessage; |
|
else |
|
{ |
|
log << TestLog::Message << "// Fail, expected " << getAttachmentParameterValueName(expectedValue) << " without error" << TestLog::EndMessage; |
|
testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid result for attachment param query"); |
|
} |
|
} |
|
|
|
static void notSupportedTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
DE_UNREF(testCtx); |
|
DE_UNREF(context); |
|
throw tcu::NotSupportedError("Not supported", "", __FILE__, __LINE__); |
|
} |
|
|
|
static void textureLevelsTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
deUint32 tex = 1; |
|
deUint32 fbo = 1; |
|
|
|
context.bindTexture(GL_TEXTURE_2D, tex); |
|
context.texImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256); |
|
context.texImage2D(GL_TEXTURE_2D, 1, GL_RGB, 128, 128); |
|
|
|
context.bindFramebuffer(GL_FRAMEBUFFER, fbo); |
|
|
|
static int levels[] = { 2, 1, 0, -1, 0x7fffffff, 0, 1 }; |
|
|
|
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(levels); ndx++) |
|
{ |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, levels[ndx]); |
|
checkError(testCtx, context, levels[ndx] == 0 ? GL_NO_ERROR : GL_INVALID_VALUE); |
|
} |
|
} |
|
|
|
static void textureLevelsWithRenderToMipmapTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
deUint32 tex = 1; |
|
deUint32 fbo = 1; |
|
|
|
context.bindTexture(GL_TEXTURE_2D, tex); |
|
context.texImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256); |
|
context.texImage2D(GL_TEXTURE_2D, 1, GL_RGB, 128, 128); |
|
|
|
context.bindFramebuffer(GL_FRAMEBUFFER, fbo); |
|
|
|
static int levels[] = { 2, 1, 0, -1, 0x7fffffff, 0, 1 }; |
|
|
|
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(levels); ndx++) |
|
{ |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, levels[ndx]); |
|
checkError(testCtx, context, de::inBounds(levels[ndx], 0, 16) ? GL_NO_ERROR : GL_INVALID_VALUE); |
|
} |
|
} |
|
|
|
static void validTex2DAttachmentsTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
context.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
static const GLenum attachmentPoints[] = |
|
{ |
|
GL_COLOR_ATTACHMENT0, |
|
GL_DEPTH_ATTACHMENT, |
|
GL_STENCIL_ATTACHMENT |
|
}; |
|
|
|
// Texture2D |
|
deUint32 tex2D = 1; |
|
context.bindTexture(GL_TEXTURE_2D, tex2D); |
|
for (int pointNdx = 0; pointNdx < DE_LENGTH_OF_ARRAY(attachmentPoints); pointNdx++) |
|
{ |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, attachmentPoints[pointNdx], GL_TEXTURE_2D, tex2D, 0); |
|
checkError(testCtx, context, GL_NO_ERROR); |
|
} |
|
} |
|
|
|
static void validTexCubeAttachmentsTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
static const GLenum attachmentPoints[] = |
|
{ |
|
GL_COLOR_ATTACHMENT0, |
|
GL_DEPTH_ATTACHMENT, |
|
GL_STENCIL_ATTACHMENT |
|
}; |
|
static const GLenum cubeTargets[] = |
|
{ |
|
GL_TEXTURE_CUBE_MAP_POSITIVE_X, |
|
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, |
|
GL_TEXTURE_CUBE_MAP_POSITIVE_Z, |
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_X, |
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, |
|
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z |
|
}; |
|
|
|
context.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
// TextureCube |
|
deUint32 texCube = 2; |
|
context.bindTexture(GL_TEXTURE_CUBE_MAP, texCube); |
|
for (int pointNdx = 0; pointNdx < DE_LENGTH_OF_ARRAY(attachmentPoints); pointNdx++) |
|
{ |
|
for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(cubeTargets); targetNdx++) |
|
{ |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, attachmentPoints[pointNdx], cubeTargets[targetNdx], texCube, 0); |
|
checkError(testCtx, context, GL_NO_ERROR); |
|
} |
|
} |
|
} |
|
|
|
static void validRboAttachmentsTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
static const GLenum attachmentPoints[] = |
|
{ |
|
GL_COLOR_ATTACHMENT0, |
|
GL_DEPTH_ATTACHMENT, |
|
GL_STENCIL_ATTACHMENT |
|
}; |
|
|
|
context.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
// Renderbuffer |
|
deUint32 rbo = 3; |
|
context.bindRenderbuffer(GL_RENDERBUFFER, rbo); |
|
for (int pointNdx = 0; pointNdx < DE_LENGTH_OF_ARRAY(attachmentPoints); pointNdx++) |
|
{ |
|
context.framebufferRenderbuffer(GL_FRAMEBUFFER, attachmentPoints[pointNdx], GL_RENDERBUFFER, rbo); |
|
checkError(testCtx, context, GL_NO_ERROR); |
|
} |
|
} |
|
|
|
static void attachToDefaultFramebufferTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
logComment(testCtx, "Attaching 2D texture to default framebuffer"); |
|
|
|
deUint32 tex2D = 1; |
|
context.bindTexture(GL_TEXTURE_2D, tex2D); |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
|
|
logComment(testCtx, "Attaching renderbuffer to default framebuffer"); |
|
|
|
deUint32 rbo = 1; |
|
context.bindRenderbuffer(GL_RENDERBUFFER, rbo); |
|
context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
} |
|
|
|
static void invalidTex2DAttachmentTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
context.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
logComment(testCtx, "Attaching 2D texture using GL_TEXTURE_CUBE_MAP_NEGATIVE_X texture target"); |
|
|
|
deUint32 tex2D = 1; |
|
context.bindTexture(GL_TEXTURE_2D, tex2D); |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, tex2D, 0); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
|
|
logComment(testCtx, "Attaching deleted 2D texture object"); |
|
context.deleteTextures(1, &tex2D); |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
} |
|
|
|
static void invalidTexCubeAttachmentTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
context.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
logComment(testCtx, "Attaching cube texture using GL_TEXTURE_2D texture target"); |
|
deUint32 texCube = 2; |
|
context.bindTexture(GL_TEXTURE_CUBE_MAP, texCube); |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texCube, 0); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
|
|
logComment(testCtx, "Attaching deleted cube texture object"); |
|
context.deleteTextures(1, &texCube); |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, 0); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
} |
|
|
|
static void invalidRboAttachmentTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
context.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
logComment(testCtx, "Attaching renderbuffer using GL_FRAMEBUFFER renderbuffer target"); |
|
deUint32 rbo = 3; |
|
context.bindRenderbuffer(GL_RENDERBUFFER, rbo); |
|
context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER, rbo); |
|
checkError(testCtx, context, GL_INVALID_ENUM); |
|
|
|
logComment(testCtx, "Attaching deleted renderbuffer object"); |
|
context.deleteRenderbuffers(1, &rbo); |
|
context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
} |
|
|
|
static void attachNamesTest (tcu::TestContext& testCtx, sglr::Context& context) |
|
{ |
|
context.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
// Just allocate some names, don't bind for storage |
|
deUint32 reservedTexName; |
|
context.genTextures(1, &reservedTexName); |
|
|
|
logComment(testCtx, "Attaching allocated texture name to 2D target"); |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, reservedTexName, 0); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
|
|
logComment(testCtx, "Attaching allocated texture name to cube target"); |
|
context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, reservedTexName, 0); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
|
|
deUint32 reservedRboName; |
|
context.genRenderbuffers(1, &reservedRboName); |
|
|
|
logComment(testCtx, "Attaching allocated renderbuffer name"); |
|
context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, reservedRboName); |
|
checkError(testCtx, context, GL_INVALID_OPERATION); |
|
} |
|
|
|
static void attachmentQueryDefaultFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
// Check that proper error codes are returned |
|
GLint unused = 1; |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &unused); |
|
checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION); |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &unused); |
|
checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION); |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &unused); |
|
checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION); |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &unused); |
|
checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION); |
|
} |
|
|
|
static void attachmentQueryEmptyFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
static const GLenum attachmentPoints[] = |
|
{ |
|
GL_COLOR_ATTACHMENT0, |
|
GL_DEPTH_ATTACHMENT, |
|
GL_STENCIL_ATTACHMENT |
|
}; |
|
|
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(attachmentPoints); ndx++) |
|
checkFboAttachmentParam(testCtx, ctx, attachmentPoints[ndx], GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE); |
|
|
|
// Check that proper error codes are returned |
|
GLint unused = -1; |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &unused); |
|
checkError(testCtx, ctx, GL_INVALID_ENUM); |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &unused); |
|
checkError(testCtx, ctx, GL_INVALID_ENUM); |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &unused); |
|
checkError(testCtx, ctx, GL_INVALID_ENUM); |
|
} |
|
|
|
static void attachmentQueryTex2DTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
ctx.bindTexture(GL_TEXTURE_2D, 1); |
|
ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 1, 0); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 1); |
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, 0); |
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, 0); |
|
} |
|
|
|
static void attachmentQueryTexCubeTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
ctx.bindTexture(GL_TEXTURE_CUBE_MAP, 2); |
|
ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 2, 0); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 2); |
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, 0); |
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y); |
|
} |
|
|
|
static void attachmentQueryRboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
ctx.bindRenderbuffer(GL_RENDERBUFFER, 3); |
|
ctx.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 3); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER); |
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 3); |
|
|
|
GLint unused = 0; |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &unused); |
|
checkError(testCtx, ctx, GL_INVALID_ENUM); |
|
ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &unused); |
|
checkError(testCtx, ctx, GL_INVALID_ENUM); |
|
} |
|
|
|
static void deleteTex2DAttachedToBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
deUint32 tex2D = 1; |
|
ctx.bindTexture(GL_TEXTURE_2D, tex2D); |
|
ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, tex2D); |
|
|
|
ctx.deleteTextures(1, &tex2D); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE); |
|
} |
|
|
|
static void deleteTexCubeAttachedToBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
deUint32 texCube = 1; |
|
ctx.bindTexture(GL_TEXTURE_CUBE_MAP, texCube); |
|
ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, 0); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, texCube); |
|
|
|
ctx.deleteTextures(1, &texCube); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE); |
|
} |
|
|
|
static void deleteRboAttachedToBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
deUint32 rbo = 1; |
|
ctx.bindRenderbuffer(GL_RENDERBUFFER, rbo); |
|
ctx.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER); |
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, rbo); |
|
|
|
ctx.deleteRenderbuffers(1, &rbo); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE); |
|
} |
|
|
|
static void deleteTex2DAttachedToNotBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
deUint32 tex2D = 1; |
|
ctx.bindTexture(GL_TEXTURE_2D, tex2D); |
|
ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, tex2D); |
|
|
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 0); |
|
|
|
ctx.deleteTextures(1, &tex2D); |
|
|
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, tex2D); |
|
} |
|
|
|
static void deleteTexCubeAttachedToNotBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
deUint32 texCube = 1; |
|
ctx.bindTexture(GL_TEXTURE_CUBE_MAP, texCube); |
|
ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, 0); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, texCube); |
|
|
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 0); |
|
|
|
ctx.deleteTextures(1, &texCube); |
|
|
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE); |
|
checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, texCube); |
|
} |
|
|
|
static void deleteRboAttachedToNotBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx) |
|
{ |
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
deUint32 rbo = 1; |
|
ctx.bindRenderbuffer(GL_RENDERBUFFER, rbo); |
|
ctx.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER); |
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, rbo); |
|
|
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 0); |
|
|
|
ctx.deleteRenderbuffers(1, &rbo); |
|
|
|
ctx.bindFramebuffer(GL_FRAMEBUFFER, 1); |
|
|
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER); |
|
checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, rbo); |
|
} |
|
|
|
class FboApiCase : public TestCase |
|
{ |
|
public: |
|
typedef void (*TestFunc) (tcu::TestContext& testCtx, sglr::Context& context); |
|
|
|
FboApiCase (Context& context, const char* name, const char* description, TestFunc test); |
|
virtual ~FboApiCase (void); |
|
|
|
virtual IterateResult iterate (void); |
|
|
|
private: |
|
FboApiCase (const FboApiCase& other); |
|
FboApiCase& operator= (const FboApiCase& other); |
|
|
|
TestFunc m_testFunc; |
|
}; |
|
|
|
FboApiCase::FboApiCase (Context& context, const char* name, const char* description, TestFunc test) |
|
: TestCase (context, name, description) |
|
, m_testFunc (test) |
|
{ |
|
} |
|
|
|
FboApiCase::~FboApiCase (void) |
|
{ |
|
} |
|
|
|
TestCase::IterateResult FboApiCase::iterate (void) |
|
{ |
|
const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
|
|
|
GLU_EXPECT_NO_ERROR(gl.getError(), "Before test case"); |
|
|
|
// Initialize result to PASS |
|
m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); |
|
|
|
// Execute test case |
|
{ |
|
sglr::GLContext context(m_context.getRenderContext(), m_testCtx.getLog(), sglr::GLCONTEXT_LOG_CALLS, tcu::IVec4(0, 0, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight())); |
|
m_testFunc(m_testCtx, context); |
|
} |
|
|
|
GLU_EXPECT_NO_ERROR(gl.getError(), "After test case"); |
|
|
|
return STOP; |
|
} |
|
|
|
FboApiTestGroup::FboApiTestGroup (Context& context) |
|
: TestCaseGroup(context, "api", "API Tests") |
|
{ |
|
} |
|
|
|
FboApiTestGroup::~FboApiTestGroup (void) |
|
{ |
|
} |
|
|
|
void FboApiTestGroup::init (void) |
|
{ |
|
std::set<std::string> extensions; |
|
std::copy(m_context.getContextInfo().getExtensions().begin(), m_context.getContextInfo().getExtensions().end(), std::inserter(extensions, extensions.begin())); |
|
|
|
bool defaultFboIsZero = m_context.getRenderContext().getDefaultFramebuffer() == 0; |
|
bool hasRenderToMipmap = extensions.find("GL_OES_fbo_render_mipmap") != extensions.end(); |
|
|
|
// Valid attachments |
|
addChild(new FboApiCase(m_context, "valid_tex2d_attachments", "Valid 2D texture attachments", validTex2DAttachmentsTest)); |
|
addChild(new FboApiCase(m_context, "valid_texcube_attachments", "Valid cubemap attachments", validTexCubeAttachmentsTest)); |
|
addChild(new FboApiCase(m_context, "valid_rbo_attachments", "Valid renderbuffer attachments", validRboAttachmentsTest)); |
|
|
|
// Invalid attachments |
|
addChild(new FboApiCase(m_context, "attach_to_default_fbo", "Invalid usage: attaching to default FBO", defaultFboIsZero ? attachToDefaultFramebufferTest : notSupportedTest)); |
|
addChild(new FboApiCase(m_context, "invalid_tex2d_attachments", "Invalid 2D texture attachments", invalidTex2DAttachmentTest)); |
|
addChild(new FboApiCase(m_context, "invalid_texcube_attachments", "Invalid cubemap attachments", invalidTexCubeAttachmentTest)); |
|
addChild(new FboApiCase(m_context, "invalid_rbo_attachments", "Invalid renderbuffer attachments", invalidRboAttachmentTest)); |
|
addChild(new FboApiCase(m_context, "attach_names", "Attach allocated names without objects", attachNamesTest)); |
|
|
|
addChild(new FboApiCase(m_context, "texture_levels", "Valid and invalid texturel levels", hasRenderToMipmap ? textureLevelsWithRenderToMipmapTest : textureLevelsTest)); |
|
|
|
// Attachment queries |
|
addChild(new FboApiCase(m_context, "attachment_query_default_fbo", "Query attachments from default FBO", defaultFboIsZero ? attachmentQueryDefaultFboTest : notSupportedTest)); |
|
addChild(new FboApiCase(m_context, "attachment_query_empty_fbo", "Query attachments from empty FBO", attachmentQueryEmptyFboTest)); |
|
addChild(new FboApiCase(m_context, "attachment_query_tex2d", "Query 2d texture attachment properties", attachmentQueryTex2DTest)); |
|
addChild(new FboApiCase(m_context, "attachment_query_texcube", "Query cubemap attachment properties", attachmentQueryTexCubeTest)); |
|
addChild(new FboApiCase(m_context, "attachment_query_rbo", "Query renderbuffer attachment properties", attachmentQueryRboTest)); |
|
|
|
// Delete attachments |
|
addChild(new FboApiCase(m_context, "delete_tex_2d_attached_to_bound_fbo", "Delete 2d texture attached to currently bound FBO", deleteTex2DAttachedToBoundFboTest)); |
|
addChild(new FboApiCase(m_context, "delete_tex_cube_attached_to_bound_fbo", "Delete cubemap attached to currently bound FBO", deleteTexCubeAttachedToBoundFboTest)); |
|
addChild(new FboApiCase(m_context, "delete_rbo_attached_to_bound_fbo", "Delete renderbuffer attached to currently bound FBO", deleteRboAttachedToBoundFboTest)); |
|
|
|
addChild(new FboApiCase(m_context, "delete_tex_2d_attached_to_not_bound_fbo", "Delete 2d texture attached to FBO", deleteTex2DAttachedToNotBoundFboTest)); |
|
addChild(new FboApiCase(m_context, "delete_tex_cube_attached_to_not_bound_fbo", "Delete cubemap attached to FBO", deleteTexCubeAttachedToNotBoundFboTest)); |
|
addChild(new FboApiCase(m_context, "delete_rbo_attached_to_not_bound_fbo", "Delete renderbuffer attached to FBO", deleteRboAttachedToNotBoundFboTest)); |
|
} |
|
|
|
} // Functional |
|
} // gles2 |
|
} // deqp
|
|
|