Path: blob/main_old/src/tests/gl_tests/CopyTexture3DTest.cpp
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56// CopyTexture3DTest.cpp: Tests of the GL_ANGLE_copy_texture_3d extension78#include "test_utils/ANGLETest.h"910#include "test_utils/gl_raii.h"1112namespace angle13{1415class CopyTexture3DTest : public ANGLETest16{17protected:18CopyTexture3DTest()19{20setWindowWidth(256);21setWindowHeight(256);22setConfigRedBits(8);23setConfigGreenBits(8);24setConfigBlueBits(8);25setConfigAlphaBits(8);26}2728void testSetUp() override29{30const char *vertexShaderSource = getVertexShaderSource();31const char *fragmentShaderSource = getFragmentShaderSource();3233mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);34ASSERT_NE(0u, mProgram);3536glUseProgram(mProgram);3738ASSERT_GL_NO_ERROR();39}4041const char *getVertexShaderSource()42{43return "#version 300 es\n"44"out vec3 texcoord;\n"45"in vec4 position;\n"46"void main()\n"47"{\n"48" gl_Position = vec4(position.xy, 0.0, 1.0);\n"49" texcoord = (position.xyz * 0.5) + 0.5;\n"50"}\n";51}5253bool checkExtensions() const54{55if (!IsGLExtensionEnabled("GL_ANGLE_copy_texture_3d"))56{57std::cout << "Test skipped because GL_ANGLE_copy_texture_3d is not available."58<< std::endl;59return false;60}6162EXPECT_NE(nullptr, glCopyTexture3DANGLE);63EXPECT_NE(nullptr, glCopySubTexture3DANGLE);64return true;65}6667void testCopy(const GLenum testTarget,68const GLColor &sourceColor,69GLenum destInternalFormat,70GLenum destType,71bool flipY,72bool premultiplyAlpha,73bool unmultiplyAlpha,74const GLColor &expectedColor)75{76std::vector<GLColor> texDataColor(2u * 2u * 2u, sourceColor);7778glBindTexture(testTarget, sourceTexture.get());79glTexImage3D(testTarget, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,80texDataColor.data());81glTexParameteri(testTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);82glTexParameteri(testTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);83glTexParameteri(testTarget, GL_TEXTURE_BASE_LEVEL, 0);84glTexParameteri(testTarget, GL_TEXTURE_MAX_LEVEL, 0);85EXPECT_GL_NO_ERROR();8687glActiveTexture(GL_TEXTURE0);88glBindTexture(testTarget, destTexture.get());89glCopyTexture3DANGLE(sourceTexture.get(), 0, testTarget, destTexture.get(), 0,90destInternalFormat, destType, flipY, premultiplyAlpha,91unmultiplyAlpha);92EXPECT_GL_NO_ERROR();9394GLRenderbuffer rbo;95glBindRenderbuffer(GL_RENDERBUFFER, rbo);9697GLenum renderType = 0;9899switch (destInternalFormat)100{101case GL_RGB:102case GL_RGBA:103case GL_LUMINANCE:104case GL_LUMINANCE_ALPHA:105case GL_ALPHA:106case GL_R8:107case GL_RG:108case GL_RG8:109case GL_RGB8:110case GL_RGBA8:111case GL_SRGB8:112case GL_RGB565:113case GL_SRGB8_ALPHA8:114case GL_RGB5_A1:115case GL_RGBA4:116case GL_R8_SNORM:117case GL_RG8_SNORM:118case GL_RGB8_SNORM:119case GL_RGBA8_SNORM:120case GL_RGB10_A2:121renderType = GL_RGBA8;122break;123case GL_R8I:124case GL_R16I:125case GL_R32I:126case GL_RG8I:127case GL_RG16I:128case GL_RG32I:129case GL_RGB8I:130case GL_RGB16I:131case GL_RGB32I:132case GL_RGBA8I:133case GL_RGBA16I:134case GL_RGBA32I:135renderType = GL_RGBA8I;136break;137case GL_R8UI:138case GL_R16UI:139case GL_R32UI:140case GL_RG8UI:141case GL_RG16UI:142case GL_RG32UI:143case GL_RGB8UI:144case GL_RGB16UI:145case GL_RGB32UI:146case GL_RGBA8UI:147case GL_RGBA16UI:148case GL_RGBA32UI:149case GL_RGB10_A2UI:150renderType = GL_RGBA8UI;151break;152case GL_R16F:153case GL_RGB16F:154case GL_RGB32F:155case GL_R32F:156case GL_RG16F:157case GL_RG32F:158case GL_RGBA16F:159case GL_RGBA32F:160case GL_R11F_G11F_B10F:161case GL_RGB9_E5:162renderType = GL_RGBA32F;163break;164default:165ASSERT_TRUE(false);166}167168glRenderbufferStorage(GL_RENDERBUFFER, renderType, 1, 1);169170GLFramebuffer fbo;171glBindFramebuffer(GL_FRAMEBUFFER, fbo);172glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);173174glTexParameteri(testTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);175glTexParameteri(testTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);176glTexParameteri(testTarget, GL_TEXTURE_BASE_LEVEL, 0);177glTexParameteri(testTarget, GL_TEXTURE_MAX_LEVEL, 0);178179drawQuad(mProgram, "position", 0.5f);180EXPECT_GL_NO_ERROR();181182if (renderType == GL_RGBA8)183{184uint32_t tolerance = 1;185// The destination formats may be emulated, so the precision may be higher than186// required. Increase the tolerance to 2^(8-width). 8 is for the 8-bit format used for187// emulation. Even though Vulkan recommends round to nearest, it's not a requirement188// so the full-range of precision is used as tolerance.189switch (destType)190{191case GL_UNSIGNED_SHORT_5_6_5:192tolerance = 8;193break;194case GL_UNSIGNED_SHORT_5_5_5_1:195tolerance = 8;196break;197case GL_UNSIGNED_SHORT_4_4_4_4:198tolerance = 16;199break;200default:201break;202}203switch (destInternalFormat)204{205case GL_RGB565:206tolerance = 8;207break;208case GL_RGB5_A1:209tolerance = 8;210break;211case GL_RGBA4:212tolerance = 16;213break;214default:215break;216}217218// If destination is SNORM, values in between representable values could round either219// way.220switch (destInternalFormat)221{222case GL_R8_SNORM:223case GL_RG8_SNORM:224case GL_RGB8_SNORM:225case GL_RGBA8_SNORM:226tolerance *= 2;227break;228default:229break;230}231232GLColor actual;233glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &actual.R);234EXPECT_GL_NO_ERROR();235EXPECT_COLOR_NEAR(expectedColor, actual, tolerance);236return;237}238else if (renderType == GL_RGBA32F)239{240float expectedColorFloat[4] = {static_cast<float>(expectedColor.R) / 255,241static_cast<float>(expectedColor.G) / 255,242static_cast<float>(expectedColor.B) / 255,243static_cast<float>(expectedColor.A) / 255};244EXPECT_PIXEL_COLOR32F_NEAR(0, 0,245GLColor32F(expectedColorFloat[0], expectedColorFloat[1],246expectedColorFloat[2], expectedColorFloat[3]),2470.015);248return;249}250else if (renderType == GL_RGBA8UI)251{252GLuint pixel[4] = {0};253glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);254EXPECT_COLOR_NEAR(255expectedColor,256GLColor(static_cast<GLubyte>(pixel[0]), static_cast<GLubyte>(pixel[1]),257static_cast<GLubyte>(pixel[2]), static_cast<GLubyte>(pixel[3])),2580.2);259}260else if (renderType == GL_RGBA8I)261{262GLint pixel[4] = {0};263glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, pixel);264EXPECT_COLOR_NEAR(265expectedColor,266GLColor(static_cast<GLubyte>(pixel[0]), static_cast<GLubyte>(pixel[1]),267static_cast<GLubyte>(pixel[2]), static_cast<GLubyte>(pixel[3])),2680.2);269}270else271{272ASSERT_TRUE(false);273}274}275276void testUnsizedFormats(const GLenum testTarget);277void testSnormFormats(const GLenum testTarget);278void testUnsignedByteFormats(const GLenum testTarget);279void testFloatFormats(const GLenum testTarget);280void testIntFormats(const GLenum testTarget);281void testUintFormats(const GLenum testTarget);282283virtual const char *getFragmentShaderSource() = 0;284285GLuint mProgram = 0;286GLTexture sourceTexture;287GLTexture destTexture;288};289290class Texture3DCopy : public CopyTexture3DTest291{292protected:293Texture3DCopy() {}294295const char *getFragmentShaderSource() override296{297return "#version 300 es\n"298"precision highp float;\n"299"uniform highp sampler3D tex3D;\n"300"in vec3 texcoord;\n"301"out vec4 fragColor;\n"302"void main()\n"303"{\n"304" fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"305"}\n";306}307};308309class Texture2DArrayCopy : public CopyTexture3DTest310{311protected:312Texture2DArrayCopy() {}313314const char *getFragmentShaderSource() override315{316return "#version 300 es\n"317"precision highp float;\n"318"uniform highp sampler2DArray tex2DArray;\n"319"in vec3 texcoord;\n"320"out vec4 fragColor;\n"321"void main()\n"322"{\n"323" fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"324"}\n";325}326};327328// Test that glCopySubTexture3DANGLE correctly copies to and from a GL_TEXTURE_3D texture.329TEST_P(Texture3DCopy, CopySubTexture)330{331ANGLE_SKIP_TEST_IF(!checkExtensions());332333sourceTexture.get();334std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);335std::vector<GLColor> texDataRed(2u * 2u * 2u, GLColor::red);336337glBindTexture(GL_TEXTURE_3D, sourceTexture.get());338glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,339texDataGreen.data());340glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);341glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);342EXPECT_GL_NO_ERROR();343344glActiveTexture(GL_TEXTURE0);345glBindTexture(GL_TEXTURE_3D, destTexture.get());346glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,347texDataRed.data());348glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);349glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);350EXPECT_GL_NO_ERROR();351glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 0, 0, 0, 0,3520, 0, 2, 2, 2, false, false, false);353glBindTexture(GL_TEXTURE_3D, destTexture.get());354EXPECT_GL_NO_ERROR();355drawQuad(mProgram, "position", 0.5f);356357EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);358}359360// Test that glCopyTexture3DANGLE correctly copies from a non-zero mipmap on a GL_TEXTURE_3D361// texture.362TEST_P(Texture3DCopy, CopyFromMipmap)363{364ANGLE_SKIP_TEST_IF(!checkExtensions());365366std::vector<GLColor> texDataGreen(4u * 4u * 4u, GLColor::green);367368glBindTexture(GL_TEXTURE_3D, sourceTexture.get());369glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,370texDataGreen.data());371glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,372texDataGreen.data());373glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);374glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);375glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);376glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);377378EXPECT_GL_NO_ERROR();379380glActiveTexture(GL_TEXTURE0);381glBindTexture(GL_TEXTURE_3D, destTexture.get());382glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);383glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);384glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);385glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);386glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);387EXPECT_GL_NO_ERROR();388389glCopyTexture3DANGLE(sourceTexture.get(), 1, GL_TEXTURE_3D, destTexture.get(), 0, GL_RGBA,390GL_UNSIGNED_BYTE, false, false, false);391glBindTexture(GL_TEXTURE_3D, destTexture.get());392EXPECT_GL_NO_ERROR();393drawQuad(mProgram, "position", 0.5f);394395EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);396}397398// Test that glCopySubTexture3DANGLE's offset and dimension parameters work correctly with a399// GL_TEXTURE_3D texture.400TEST_P(Texture3DCopy, OffsetSubCopy)401{402ANGLE_SKIP_TEST_IF(!checkExtensions());403404GLColor rgbaPixels[27];405406// Create pixel data for a 3x3x3 red cube407for (int i = 0; i < 27; i++)408{409rgbaPixels[i] = GLColor(255u, 0u, 0u, 255u);410}411412// Change a pixel to create a 1x1x1 blue cube at (0, 0, 0)413rgbaPixels[0] = GLColor(0u, 0u, 255u, 255u);414415// Change some pixels to green to create a 2x2x2 cube starting at (1, 1, 1)416rgbaPixels[13] = GLColor(0u, 255u, 0u, 255u);417rgbaPixels[14] = GLColor(0u, 255u, 0u, 255u);418rgbaPixels[16] = GLColor(0u, 255u, 0u, 255u);419rgbaPixels[17] = GLColor(0u, 255u, 0u, 255u);420rgbaPixels[22] = GLColor(0u, 255u, 0u, 255u);421rgbaPixels[23] = GLColor(0u, 255u, 0u, 255u);422rgbaPixels[25] = GLColor(0u, 255u, 0u, 255u);423rgbaPixels[26] = GLColor(0u, 255u, 0u, 255u);424425glBindTexture(GL_TEXTURE_3D, sourceTexture.get());426glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 3, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);427glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);428glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);429glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);430glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);431EXPECT_GL_NO_ERROR();432433glActiveTexture(GL_TEXTURE0);434glBindTexture(GL_TEXTURE_3D, destTexture.get());435glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);436glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);437glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);438glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);439glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);440glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);441glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);442glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);443444EXPECT_GL_NO_ERROR();445// Copy the 2x2x2 green cube into a new texture446glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 0, 0, 0, 1,4471, 1, 2, 2, 2, false, false, false);448glBindTexture(GL_TEXTURE_3D, destTexture.get());449EXPECT_GL_NO_ERROR();450drawQuad(mProgram, "position", 1.0f);451int width = getWindowWidth() - 1;452int height = getWindowHeight() - 1;453454EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);455EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);456EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);457EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);458459// Copy the 1x1x1 blue cube into the the 2x2x2 green cube at location (1, 1, 1)460glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 1, 1, 1, 0,4610, 0, 1, 1, 1, false, false, false);462EXPECT_GL_NO_ERROR();463drawQuad(mProgram, "position", 1.0f);464EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);465EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);466EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);467EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::blue);468}469470// Test that the flipY parameter works with a GL_TEXTURE_3D texture.471TEST_P(Texture3DCopy, FlipY)472{473ANGLE_SKIP_TEST_IF(!checkExtensions());474475// Create a 2x2x2 cube. The top half is red. The bottom half is green.476GLColor rgbaPixels[8] = {GLColor::green, GLColor::green, GLColor::red, GLColor::red,477GLColor::green, GLColor::green, GLColor::red, GLColor::red};478479glBindTexture(GL_TEXTURE_3D, sourceTexture.get());480glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);481glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);482glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);483glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);484glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);485glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);486glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);487glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);488489// mProgram creates a quad with the colors from the top (y-direction) layer of the 3D texture.490// 3D pixel (<x>, <y>, <z>) is drawn to 2D pixel (<x>, <z>) for <y> = 1.491drawQuad(mProgram, "position", 1.0f);492493int width = getWindowWidth() - 1;494int height = getWindowHeight() - 1;495496EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);497EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::red);498EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::red);499EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::red);500501EXPECT_GL_NO_ERROR();502503glActiveTexture(GL_TEXTURE0);504glBindTexture(GL_TEXTURE_3D, destTexture.get());505glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);506glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);507glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);508glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);509glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);510glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);511glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);512glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);513EXPECT_GL_NO_ERROR();514515// Flip the y coordinate. This will put the greem half on top, and the red half on the bottom.516glCopyTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, GL_RGBA,517GL_UNSIGNED_BYTE, true, false, false);518519glBindTexture(GL_TEXTURE_3D, destTexture.get());520EXPECT_GL_NO_ERROR();521drawQuad(mProgram, "position", 1.0f);522523EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);524EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);525EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);526EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);527}528529void CopyTexture3DTest::testUnsizedFormats(const GLenum testTarget)530{531const GLColor kColorNoAlpha(250, 200, 150, 100);532const GLColor kColorPreAlpha(250, 200, 150, 100);533const GLColor kColorUnAlpha(101, 150, 200, 200);534535testCopy(testTarget, kColorNoAlpha, GL_RGB, GL_UNSIGNED_BYTE, false, false, false,536GLColor(250, 200, 150, 255));537testCopy(testTarget, kColorPreAlpha, GL_RGB, GL_UNSIGNED_BYTE, false, true, false,538GLColor(98, 78, 59, 255));539testCopy(testTarget, kColorUnAlpha, GL_RGB, GL_UNSIGNED_BYTE, false, false, true,540GLColor(128, 191, 255, 255));541542testCopy(testTarget, kColorNoAlpha, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false, false, false,543GLColor(247, 199, 148, 255));544testCopy(testTarget, kColorPreAlpha, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false, true, false,545GLColor(99, 77, 57, 255));546testCopy(testTarget, kColorUnAlpha, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false, false, true,547GLColor(132, 190, 255, 255));548549testCopy(testTarget, kColorNoAlpha, GL_RGBA, GL_UNSIGNED_BYTE, false, false, false,550GLColor(250, 200, 150, 100));551testCopy(testTarget, kColorPreAlpha, GL_RGBA, GL_UNSIGNED_BYTE, false, true, false,552GLColor(98, 78, 59, 100));553testCopy(testTarget, kColorUnAlpha, GL_RGBA, GL_UNSIGNED_BYTE, false, false, true,554GLColor(128, 191, 255, 200));555556testCopy(testTarget, kColorNoAlpha, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false, false, false,557GLColor(255, 204, 153, 102));558testCopy(testTarget, kColorPreAlpha, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false, true, false,559GLColor(102, 85, 51, 102));560testCopy(testTarget, kColorUnAlpha, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false, false, true,561GLColor(136, 187, 255, 204));562563testCopy(testTarget, kColorNoAlpha, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false, false, false,564GLColor(247, 198, 148, 0));565testCopy(testTarget, kColorPreAlpha, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false, true, false,566GLColor(99, 82, 57, 0));567testCopy(testTarget, kColorUnAlpha, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false, false, true,568GLColor(132, 189, 255, 255));569570testCopy(testTarget, kColorNoAlpha, GL_LUMINANCE, GL_UNSIGNED_BYTE, false, false, false,571GLColor(250, 250, 250, 255));572testCopy(testTarget, kColorPreAlpha, GL_LUMINANCE, GL_UNSIGNED_BYTE, false, true, false,573GLColor(98, 98, 98, 255));574testCopy(testTarget, kColorUnAlpha, GL_LUMINANCE, GL_UNSIGNED_BYTE, false, false, true,575GLColor(128, 128, 128, 255));576577testCopy(testTarget, kColorNoAlpha, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, false, false, false,578GLColor(250, 250, 250, 100));579testCopy(testTarget, kColorPreAlpha, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, false, true, false,580GLColor(98, 98, 98, 100));581testCopy(testTarget, kColorUnAlpha, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, false, false, true,582GLColor(128, 128, 128, 200));583584testCopy(testTarget, kColorNoAlpha, GL_ALPHA, GL_UNSIGNED_BYTE, false, false, false,585GLColor(0, 0, 0, 100));586testCopy(testTarget, kColorNoAlpha, GL_ALPHA, GL_UNSIGNED_BYTE, false, false, false,587GLColor(0, 0, 0, 100));588testCopy(testTarget, kColorNoAlpha, GL_ALPHA, GL_UNSIGNED_BYTE, false, false, false,589GLColor(0, 0, 0, 100));590}591592// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsized593// formats.594TEST_P(Texture3DCopy, UnsizedFormats)595{596ANGLE_SKIP_TEST_IF(!checkExtensions());597598testUnsizedFormats(GL_TEXTURE_3D);599}600601void CopyTexture3DTest::testSnormFormats(const GLenum testTarget)602{603const GLColor kColorNoAlpha(250, 200, 150, 190);604const GLColor kColorPreAlpha(250, 200, 150, 190);605const GLColor kColorUnAlpha(200, 150, 100, 230);606607testCopy(testTarget, kColorNoAlpha, GL_R8_SNORM, GL_BYTE, false, false, false,608GLColor(251, 0, 0, 255));609testCopy(testTarget, kColorPreAlpha, GL_R8_SNORM, GL_BYTE, false, true, false,610GLColor(187, 0, 0, 255));611testCopy(testTarget, kColorUnAlpha, GL_R8_SNORM, GL_BYTE, false, false, true,612GLColor(221, 0, 0, 255));613614testCopy(testTarget, kColorNoAlpha, GL_RG8_SNORM, GL_BYTE, false, false, false,615GLColor(251, 201, 0, 255));616testCopy(testTarget, kColorPreAlpha, GL_RG8_SNORM, GL_BYTE, false, true, false,617GLColor(187, 149, 0, 255));618testCopy(testTarget, kColorUnAlpha, GL_RG8_SNORM, GL_BYTE, false, false, true,619GLColor(221, 167, 0, 255));620621testCopy(testTarget, kColorNoAlpha, GL_RGB8_SNORM, GL_BYTE, false, false, false,622GLColor(251, 201, 151, 255));623testCopy(testTarget, kColorPreAlpha, GL_RGB8_SNORM, GL_BYTE, false, true, false,624GLColor(187, 149, 112, 255));625testCopy(testTarget, kColorUnAlpha, GL_RGB8_SNORM, GL_BYTE, false, false, true,626GLColor(221, 167, 110, 255));627628testCopy(testTarget, kColorNoAlpha, GL_RGBA8_SNORM, GL_BYTE, false, false, false,629GLColor(251, 201, 151, 191));630testCopy(testTarget, kColorPreAlpha, GL_RGBA8_SNORM, GL_BYTE, false, true, false,631GLColor(187, 149, 112, 191));632testCopy(testTarget, kColorUnAlpha, GL_RGBA8_SNORM, GL_BYTE, false, false, true,633GLColor(221, 167, 110, 231));634635testCopy(testTarget, GLColor(250, 200, 150, 100), GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV,636false, false, false, GLColor(250, 200, 150, 85));637testCopy(testTarget, GLColor(250, 200, 150, 200), GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV,638false, true, false, GLColor(196, 157, 118, 170));639testCopy(testTarget, GLColor(101, 150, 190, 200), GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV,640false, false, true, GLColor(128, 191, 242, 170));641}642643// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with snorm644// formats.645TEST_P(Texture3DCopy, SnormFormats)646{647ANGLE_SKIP_TEST_IF(!checkExtensions());648649testSnormFormats(GL_TEXTURE_3D);650}651652void CopyTexture3DTest::testUnsignedByteFormats(const GLenum testTarget)653{654{655const GLColor kColorNoAlpha(250, 200, 150, 100);656const GLColor kColorPreAlpha(250, 200, 150, 100);657const GLColor kColorUnAlpha(200, 150, 100, 230);658659testCopy(testTarget, kColorNoAlpha, GL_R8, GL_UNSIGNED_BYTE, false, false, false,660GLColor(250, 0, 0, 255));661testCopy(testTarget, kColorPreAlpha, GL_R8, GL_UNSIGNED_BYTE, false, true, false,662GLColor(98, 0, 0, 255));663testCopy(testTarget, kColorUnAlpha, GL_R8, GL_UNSIGNED_BYTE, false, false, true,664GLColor(221, 0, 0, 255));665666testCopy(testTarget, kColorNoAlpha, GL_RG8, GL_UNSIGNED_BYTE, false, false, false,667GLColor(250, 200, 0, 255));668testCopy(testTarget, kColorPreAlpha, GL_RG8, GL_UNSIGNED_BYTE, false, true, false,669GLColor(98, 78, 0, 255));670testCopy(testTarget, kColorUnAlpha, GL_RG8, GL_UNSIGNED_BYTE, false, false, true,671GLColor(221, 167, 0, 255));672673testCopy(testTarget, kColorNoAlpha, GL_RGB8, GL_UNSIGNED_BYTE, false, false, false,674GLColor(250, 200, 150, 255));675testCopy(testTarget, kColorPreAlpha, GL_RGB8, GL_UNSIGNED_BYTE, false, true, false,676GLColor(98, 78, 59, 255));677testCopy(testTarget, kColorUnAlpha, GL_RGB8, GL_UNSIGNED_BYTE, false, false, true,678GLColor(221, 167, 110, 255));679680testCopy(testTarget, kColorNoAlpha, GL_RGBA8, GL_UNSIGNED_BYTE, false, false, false,681GLColor(250, 200, 150, 100));682testCopy(testTarget, kColorPreAlpha, GL_RGBA8, GL_UNSIGNED_BYTE, false, true, false,683GLColor(98, 78, 59, 100));684testCopy(testTarget, kColorUnAlpha, GL_RGBA8, GL_UNSIGNED_BYTE, false, false, true,685GLColor(221, 167, 110, 230));686687testCopy(testTarget, kColorNoAlpha, GL_RGBA4, GL_UNSIGNED_BYTE, false, false, false,688GLColor(255, 204, 153, 102));689testCopy(testTarget, kColorPreAlpha, GL_RGBA4, GL_UNSIGNED_BYTE, false, true, false,690GLColor(102, 85, 51, 102));691testCopy(testTarget, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_BYTE, false, false,692true, GLColor(119, 187, 238, 204));693694testCopy(testTarget, kColorNoAlpha, GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, false, false,695false, GLColor(255, 204, 153, 102));696testCopy(testTarget, kColorPreAlpha, GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, false, true,697false, GLColor(102, 85, 51, 102));698testCopy(testTarget, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4,699false, false, true, GLColor(119, 187, 238, 204));700701testCopy(testTarget, kColorNoAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, false, false,702GLColor(244, 148, 78, 255));703testCopy(testTarget, kColorPreAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, true, false,704GLColor(31, 19, 11, 255));705testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8, GL_UNSIGNED_BYTE, false, false,706true, GLColor(49, 120, 228, 255));707708testCopy(testTarget, kColorNoAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, false, false,709GLColor(244, 148, 78, 100));710testCopy(testTarget, kColorPreAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, true, false,711GLColor(31, 19, 11, 100));712testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false,713false, true, GLColor(49, 120, 228, 210));714715testCopy(testTarget, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_BYTE, false,716false, false, GLColor(247, 198, 148, 255));717testCopy(testTarget, kColorPreAlpha, GL_RGB5_A1, GL_UNSIGNED_BYTE, false, true, false,718GLColor(99, 82, 57, 0));719testCopy(testTarget, kColorUnAlpha, GL_RGB5_A1, GL_UNSIGNED_BYTE, false, false, true,720GLColor(221, 167, 110, 255));721}722723{724const GLColor kColorNoAlpha(250, 200, 150, 200);725const GLColor kColorPreAlpha(250, 200, 150, 200);726const GLColor kColorUnAlpha(101, 150, 190, 200);727728testCopy(testTarget, kColorNoAlpha, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, false,729false, false, GLColor(247, 198, 148, 255));730testCopy(testTarget, kColorPreAlpha, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, false,731true, false, GLColor(198, 156, 115, 255));732testCopy(testTarget, kColorUnAlpha, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, false,733false, true, GLColor(132, 189, 242, 255));734735testCopy(testTarget, kColorNoAlpha, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, false, false,736false, GLColor(247, 198, 148, 255));737testCopy(testTarget, kColorPreAlpha, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, false, true,738false, GLColor(198, 156, 115, 255));739testCopy(testTarget, kColorUnAlpha, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, false, false,740true, GLColor(132, 189, 242, 255));741742testCopy(testTarget, kColorNoAlpha, GL_RGB565, GL_UNSIGNED_BYTE, false, false, false,743GLColor(247, 199, 148, 255));744testCopy(testTarget, kColorPreAlpha, GL_RGB565, GL_UNSIGNED_BYTE, false, true, false,745GLColor(198, 158, 115, 255));746testCopy(testTarget, kColorUnAlpha, GL_RGB565, GL_UNSIGNED_BYTE, false, false, true,747GLColor(132, 190, 242, 255));748749testCopy(testTarget, kColorNoAlpha, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false, false, false,750GLColor(247, 199, 148, 255));751testCopy(testTarget, kColorPreAlpha, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false, true, false,752GLColor(198, 158, 115, 255));753testCopy(testTarget, kColorUnAlpha, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false, false, true,754GLColor(132, 190, 242, 255));755}756}757758// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsigned759// byte formats.760TEST_P(Texture3DCopy, UnsignedByteFormats)761{762ANGLE_SKIP_TEST_IF(!checkExtensions());763764testUnsignedByteFormats(GL_TEXTURE_3D);765}766767void CopyTexture3DTest::testFloatFormats(const GLenum testTarget)768{769std::vector<GLenum> floatTypes = {GL_FLOAT, GL_HALF_FLOAT, GL_UNSIGNED_INT_10F_11F_11F_REV,770GL_UNSIGNED_INT_5_9_9_9_REV};771772const GLColor kColor(210, 200, 150, 235);773774for (GLenum floatType : floatTypes)775{776if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV &&777floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)778{779testCopy(testTarget, kColor, GL_R16F, floatType, false, false, false,780GLColor(210, 0, 0, 255));781testCopy(testTarget, kColor, GL_R16F, floatType, false, true, false,782GLColor(191, 0, 0, 255));783testCopy(testTarget, kColor, GL_R16F, floatType, false, false, true,784GLColor(227, 0, 0, 255));785786testCopy(testTarget, kColor, GL_RG16F, floatType, false, false, false,787GLColor(210, 200, 0, 255));788testCopy(testTarget, kColor, GL_RG16F, floatType, false, true, false,789GLColor(191, 184, 0, 255));790testCopy(testTarget, kColor, GL_RG16F, floatType, false, false, true,791GLColor(227, 217, 0, 255));792793testCopy(testTarget, kColor, GL_RGB16F, floatType, false, false, false,794GLColor(210, 200, 150, 255));795testCopy(testTarget, kColor, GL_RGB16F, floatType, false, true, false,796GLColor(191, 184, 138, 255));797testCopy(testTarget, kColor, GL_RGB16F, floatType, false, false, true,798GLColor(227, 217, 161, 255));799800testCopy(testTarget, kColor, GL_RGBA16F, floatType, false, false, false,801GLColor(210, 200, 150, 235));802testCopy(testTarget, kColor, GL_RGBA16F, floatType, false, true, false,803GLColor(191, 184, 138, 235));804testCopy(testTarget, kColor, GL_RGBA16F, floatType, false, false, true,805GLColor(227, 217, 161, 235));806}807808if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV)809{810testCopy(testTarget, kColor, GL_R11F_G11F_B10F, floatType, false, false, false,811GLColor(210, 200, 148, 255));812testCopy(testTarget, kColor, GL_R11F_G11F_B10F, floatType, false, true, false,813GLColor(191, 184, 138, 255));814testCopy(testTarget, kColor, GL_R11F_G11F_B10F, floatType, false, false, true,815GLColor(227, 217, 161, 255));816}817818if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)819{820testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, false,821GLColor(210, 200, 148, 255));822testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, true, false,823GLColor(192, 184, 138, 255));824testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, true,825GLColor(227, 217, 161, 255));826}827}828829testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, false, false, GLColor(210, 0, 0, 255));830testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, true, false, GLColor(191, 0, 0, 255));831testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, false, true, GLColor(227, 0, 0, 255));832833testCopy(testTarget, kColor, GL_RG32F, GL_FLOAT, false, false, false,834GLColor(210, 200, 0, 255));835testCopy(testTarget, kColor, GL_RG32F, GL_FLOAT, false, true, false, GLColor(191, 184, 0, 255));836testCopy(testTarget, kColor, GL_RG32F, GL_FLOAT, false, false, true, GLColor(227, 217, 0, 255));837838testCopy(testTarget, kColor, GL_RGB32F, GL_FLOAT, false, false, false,839GLColor(210, 200, 150, 255));840testCopy(testTarget, kColor, GL_RGB32F, GL_FLOAT, false, true, false,841GLColor(191, 184, 138, 255));842testCopy(testTarget, kColor, GL_RGB32F, GL_FLOAT, false, false, true,843GLColor(227, 217, 161, 255));844845testCopy(testTarget, kColor, GL_RGBA32F, GL_FLOAT, false, false, false,846GLColor(210, 200, 150, 235));847testCopy(testTarget, kColor, GL_RGBA32F, GL_FLOAT, false, true, false,848GLColor(191, 184, 138, 235));849testCopy(testTarget, kColor, GL_RGBA32F, GL_FLOAT, false, false, true,850GLColor(227, 217, 161, 235));851}852853// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with float854// formats.855TEST_P(Texture3DCopy, FloatFormats)856{857ANGLE_SKIP_TEST_IF(!checkExtensions());858859// http://anglebug.com/4756860ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());861862testFloatFormats(GL_TEXTURE_3D);863}864865void CopyTexture3DTest::testIntFormats(const GLenum testTarget)866{867const GLColor kColor(255, 140, 150, 230);868869// Pixels will be read as if the most significant bit is data, not the sign. The expected colors870// reflect this.871testCopy(testTarget, kColor, GL_R8I, GL_BYTE, false, false, false, GLColor(127, 0, 0, 1));872testCopy(testTarget, kColor, GL_R8I, GL_BYTE, false, true, false, GLColor(115, 0, 0, 1));873testCopy(testTarget, kColor, GL_R8I, GL_BYTE, false, false, true, GLColor(127, 0, 0, 1));874875testCopy(testTarget, kColor, GL_R16I, GL_SHORT, false, false, false, GLColor(127, 0, 0, 1));876testCopy(testTarget, kColor, GL_R16I, GL_SHORT, false, true, false, GLColor(115, 0, 0, 1));877testCopy(testTarget, kColor, GL_R16I, GL_SHORT, false, false, true, GLColor(127, 0, 0, 1));878879testCopy(testTarget, kColor, GL_R32I, GL_INT, false, false, false, GLColor(127, 0, 0, 1));880testCopy(testTarget, kColor, GL_R32I, GL_INT, false, true, false, GLColor(115, 0, 0, 1));881testCopy(testTarget, kColor, GL_R32I, GL_INT, false, false, true, GLColor(127, 0, 0, 1));882883testCopy(testTarget, kColor, GL_RG8I, GL_BYTE, false, false, false, GLColor(127, 70, 0, 1));884testCopy(testTarget, kColor, GL_RG8I, GL_BYTE, false, true, false, GLColor(115, 63, 0, 1));885testCopy(testTarget, kColor, GL_RG8I, GL_BYTE, false, false, true, GLColor(127, 77, 0, 1));886887testCopy(testTarget, kColor, GL_RG16I, GL_SHORT, false, false, false, GLColor(127, 70, 0, 1));888testCopy(testTarget, kColor, GL_RG16I, GL_SHORT, false, true, false, GLColor(115, 63, 0, 1));889testCopy(testTarget, kColor, GL_RG16I, GL_SHORT, false, false, true, GLColor(127, 77, 0, 1));890891testCopy(testTarget, kColor, GL_RG32I, GL_INT, false, false, false, GLColor(127, 70, 0, 1));892testCopy(testTarget, kColor, GL_RG32I, GL_INT, false, true, false, GLColor(115, 63, 0, 1));893testCopy(testTarget, kColor, GL_RG32I, GL_INT, false, false, true, GLColor(127, 77, 0, 1));894895testCopy(testTarget, kColor, GL_RGB8I, GL_BYTE, false, false, false, GLColor(127, 70, 75, 1));896testCopy(testTarget, kColor, GL_RGB8I, GL_BYTE, false, true, false, GLColor(115, 63, 67, 1));897testCopy(testTarget, kColor, GL_RGB8I, GL_BYTE, false, false, true, GLColor(127, 77, 83, 1));898899testCopy(testTarget, kColor, GL_RGB16I, GL_SHORT, false, false, false, GLColor(127, 70, 75, 1));900testCopy(testTarget, kColor, GL_RGB16I, GL_SHORT, false, true, false, GLColor(115, 63, 67, 1));901testCopy(testTarget, kColor, GL_RGB16I, GL_SHORT, false, false, true, GLColor(127, 77, 83, 1));902903testCopy(testTarget, kColor, GL_RGB32I, GL_INT, false, false, false, GLColor(127, 70, 75, 1));904testCopy(testTarget, kColor, GL_RGB32I, GL_INT, false, true, false, GLColor(115, 63, 67, 1));905testCopy(testTarget, kColor, GL_RGB32I, GL_INT, false, false, true, GLColor(127, 77, 83, 1));906907testCopy(testTarget, kColor, GL_RGBA8I, GL_BYTE, false, false, false,908GLColor(127, 70, 75, 115));909testCopy(testTarget, kColor, GL_RGBA8I, GL_BYTE, false, true, false, GLColor(115, 63, 67, 115));910testCopy(testTarget, kColor, GL_RGBA8I, GL_BYTE, false, false, true, GLColor(127, 77, 83, 115));911912testCopy(testTarget, kColor, GL_RGBA16I, GL_SHORT, false, false, false,913GLColor(127, 70, 75, 115));914testCopy(testTarget, kColor, GL_RGBA16I, GL_SHORT, false, true, false,915GLColor(115, 63, 67, 115));916testCopy(testTarget, kColor, GL_RGBA16I, GL_SHORT, false, false, true,917GLColor(127, 77, 83, 115));918919testCopy(testTarget, kColor, GL_RGBA32I, GL_INT, false, false, false,920GLColor(127, 70, 75, 115));921testCopy(testTarget, kColor, GL_RGBA32I, GL_INT, false, true, false, GLColor(115, 63, 67, 115));922testCopy(testTarget, kColor, GL_RGBA32I, GL_INT, false, false, true, GLColor(127, 77, 83, 115));923}924925// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with integer926// formats.927TEST_P(Texture3DCopy, IntFormats)928{929ANGLE_SKIP_TEST_IF(!checkExtensions());930931// Vulkan multiplies source by 255 unconditionally, which is wrong for signed integer formats.932// http://anglebug.com/4741933ANGLE_SKIP_TEST_IF(IsVulkan());934935constexpr char kFS[] =936"#version 300 es\n"937"precision highp float;\n"938"uniform highp isampler3D tex3D;\n"939"in vec3 texcoord;\n"940"out ivec4 fragColor;\n"941"void main()\n"942"{\n"943" fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"944"}\n";945946mProgram = CompileProgram(getVertexShaderSource(), kFS);947ASSERT_NE(0u, mProgram);948ASSERT_GL_NO_ERROR();949950glUseProgram(mProgram);951952testIntFormats(GL_TEXTURE_3D);953}954955void CopyTexture3DTest::testUintFormats(const GLenum testTarget)956{957const GLColor kColor(128, 84, 32, 100);958959testCopy(testTarget, kColor, GL_R8UI, GL_UNSIGNED_BYTE, false, false, false,960GLColor(128, 0, 0, 1));961testCopy(testTarget, kColor, GL_R8UI, GL_UNSIGNED_BYTE, false, true, false,962GLColor(50, 0, 0, 1));963testCopy(testTarget, kColor, GL_R8UI, GL_UNSIGNED_BYTE, false, false, true,964GLColor(255, 0, 0, 1));965966testCopy(testTarget, kColor, GL_R16UI, GL_UNSIGNED_SHORT, false, false, false,967GLColor(128, 0, 0, 1));968testCopy(testTarget, kColor, GL_R16UI, GL_UNSIGNED_SHORT, false, true, false,969GLColor(50, 0, 0, 1));970testCopy(testTarget, kColor, GL_R16UI, GL_UNSIGNED_SHORT, false, false, true,971GLColor(255, 0, 0, 1));972973testCopy(testTarget, kColor, GL_R32UI, GL_UNSIGNED_INT, false, false, false,974GLColor(128, 0, 0, 1));975testCopy(testTarget, kColor, GL_R32UI, GL_UNSIGNED_INT, false, true, false,976GLColor(50, 0, 0, 1));977testCopy(testTarget, kColor, GL_R32UI, GL_UNSIGNED_INT, false, false, true,978GLColor(255, 0, 0, 1));979980testCopy(testTarget, kColor, GL_RG8UI, GL_UNSIGNED_BYTE, false, false, false,981GLColor(128, 84, 0, 1));982testCopy(testTarget, kColor, GL_RG8UI, GL_UNSIGNED_BYTE, false, true, false,983GLColor(50, 32, 0, 1));984testCopy(testTarget, kColor, GL_RG8UI, GL_UNSIGNED_BYTE, false, false, true,985GLColor(255, 214, 0, 1));986987testCopy(testTarget, kColor, GL_RG16UI, GL_UNSIGNED_SHORT, false, false, false,988GLColor(128, 84, 0, 1));989testCopy(testTarget, kColor, GL_RG16UI, GL_UNSIGNED_SHORT, false, true, false,990GLColor(50, 32, 0, 1));991testCopy(testTarget, kColor, GL_RG16UI, GL_UNSIGNED_SHORT, false, false, true,992GLColor(255, 214, 0, 1));993994testCopy(testTarget, kColor, GL_RG32UI, GL_UNSIGNED_INT, false, false, false,995GLColor(128, 84, 0, 1));996testCopy(testTarget, kColor, GL_RG32UI, GL_UNSIGNED_INT, false, true, false,997GLColor(50, 32, 0, 1));998testCopy(testTarget, kColor, GL_RG32UI, GL_UNSIGNED_INT, false, false, true,999GLColor(255, 214, 0, 1));10001001testCopy(testTarget, kColor, GL_RGB8UI, GL_UNSIGNED_BYTE, false, false, false,1002GLColor(128, 84, 32, 1));1003testCopy(testTarget, kColor, GL_RGB8UI, GL_UNSIGNED_BYTE, false, true, false,1004GLColor(50, 32, 12, 1));1005testCopy(testTarget, kColor, GL_RGB8UI, GL_UNSIGNED_BYTE, false, false, true,1006GLColor(255, 214, 81, 1));10071008testCopy(testTarget, kColor, GL_RGB16UI, GL_UNSIGNED_SHORT, false, false, false,1009GLColor(128, 84, 32, 1));1010testCopy(testTarget, kColor, GL_RGB16UI, GL_UNSIGNED_SHORT, false, true, false,1011GLColor(50, 32, 12, 1));1012testCopy(testTarget, kColor, GL_RGB16UI, GL_UNSIGNED_SHORT, false, false, true,1013GLColor(255, 214, 81, 1));10141015testCopy(testTarget, kColor, GL_RGB32UI, GL_UNSIGNED_INT, false, false, false,1016GLColor(128, 84, 32, 1));1017testCopy(testTarget, kColor, GL_RGB32UI, GL_UNSIGNED_INT, false, true, false,1018GLColor(50, 32, 12, 1));1019testCopy(testTarget, kColor, GL_RGB32UI, GL_UNSIGNED_INT, false, false, true,1020GLColor(255, 214, 81, 1));10211022testCopy(testTarget, kColor, GL_RGBA8UI, GL_UNSIGNED_BYTE, false, false, false,1023GLColor(128, 84, 32, 100));1024testCopy(testTarget, kColor, GL_RGBA8UI, GL_UNSIGNED_BYTE, false, true, false,1025GLColor(50, 32, 12, 100));1026testCopy(testTarget, kColor, GL_RGBA8UI, GL_UNSIGNED_BYTE, false, false, true,1027GLColor(255, 214, 81, 100));10281029testCopy(testTarget, kColor, GL_RGBA16UI, GL_UNSIGNED_SHORT, false, false, false,1030GLColor(128, 84, 32, 100));1031testCopy(testTarget, kColor, GL_RGBA16UI, GL_UNSIGNED_SHORT, false, true, false,1032GLColor(50, 32, 12, 100));1033testCopy(testTarget, kColor, GL_RGBA16UI, GL_UNSIGNED_SHORT, false, false, true,1034GLColor(255, 214, 81, 100));10351036testCopy(testTarget, kColor, GL_RGBA32UI, GL_UNSIGNED_INT, false, false, false,1037GLColor(128, 84, 32, 100));1038testCopy(testTarget, kColor, GL_RGBA32UI, GL_UNSIGNED_INT, false, true, false,1039GLColor(50, 32, 12, 100));1040testCopy(testTarget, kColor, GL_RGBA32UI, GL_UNSIGNED_INT, false, false, true,1041GLColor(255, 214, 81, 100));10421043testCopy(testTarget, kColor, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, false, false, false,1044GLColor(128, 84, 32, 3));1045testCopy(testTarget, kColor, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, false, true, false,1046GLColor(50, 32, 12, 3));1047testCopy(testTarget, kColor, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true,1048GLColor(255, 214, 81, 3));1049}10501051// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsigned1052// integer formats.1053TEST_P(Texture3DCopy, UintFormats)1054{1055ANGLE_SKIP_TEST_IF(!checkExtensions());10561057// Vulkan multiplies source by 255 unconditionally, which is wrong for non-8-bit integer1058// formats. http://anglebug.com/47411059ANGLE_SKIP_TEST_IF(IsVulkan());10601061constexpr char kFS[] =1062"#version 300 es\n"1063"precision highp float;\n"1064"uniform highp usampler3D tex3D;\n"1065"in vec3 texcoord;\n"1066"out uvec4 fragColor;\n"1067"void main()\n"1068"{\n"1069" fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"1070"}\n";10711072mProgram = CompileProgram(getVertexShaderSource(), kFS);1073ASSERT_NE(0u, mProgram);1074ASSERT_GL_NO_ERROR();10751076glUseProgram(mProgram);10771078testUintFormats(GL_TEXTURE_3D);1079}10801081// Test that glCopySubTexture3DANGLE correctly copies to and from a GL_TEXTURE_2D_ARRAY texture.1082TEST_P(Texture2DArrayCopy, CopySubTexture)1083{1084ANGLE_SKIP_TEST_IF(!checkExtensions());10851086std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);1087std::vector<GLColor> texDataRed(2u * 2u * 2u, GLColor::red);10881089glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());1090EXPECT_GL_NO_ERROR();1091glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,1092texDataGreen.data());1093EXPECT_GL_NO_ERROR();1094glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);1095glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);1096glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);1097glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);1098EXPECT_GL_NO_ERROR();10991100glActiveTexture(GL_TEXTURE0);1101glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());1102glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,1103texDataRed.data());1104glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);1105glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);1106glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);1107glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);1108EXPECT_GL_NO_ERROR();1109glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 0, 0,11100, 0, 0, 0, 2, 2, 2, false, false, false);1111EXPECT_GL_NO_ERROR();1112drawQuad(mProgram, "position", 0.5f);11131114EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);1115}11161117// Test that glCopyTexture3DANGLE correctly copies from a non-zero mipmap on a GL_TEXTURE_2D_ARRAY1118// texture.1119TEST_P(Texture2DArrayCopy, CopyFromMipmap)1120{1121ANGLE_SKIP_TEST_IF(!checkExtensions());11221123std::vector<GLColor> texDataGreen4(4u * 4u * 4u, GLColor::green);1124std::vector<GLColor> texDataGreen2(2u * 2u * 2u, GLColor::green);1125std::vector<GLColor> texDataRed2(2u * 2u * 2u, GLColor::red);11261127glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());1128glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,1129texDataGreen4.data());1130glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,1131texDataGreen2.data());1132EXPECT_GL_NO_ERROR();1133glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1134glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1135glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);1136glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);1137EXPECT_GL_NO_ERROR();11381139glActiveTexture(GL_TEXTURE0);1140glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());1141glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);1142glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1143glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1144glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);1145glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);11461147EXPECT_GL_NO_ERROR();1148glCopyTexture3DANGLE(sourceTexture.get(), 1, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, GL_RGBA,1149GL_UNSIGNED_BYTE, false, false, false);11501151EXPECT_GL_NO_ERROR();1152drawQuad(mProgram, "position", 1.0f);11531154EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);1155}11561157// Test that glCopySubTexture3DANGLE's offset and dimension parameters work correctly with a1158// GL_TEXTURE_2D_ARRAY texture.1159TEST_P(Texture2DArrayCopy, OffsetSubCopy)1160{1161ANGLE_SKIP_TEST_IF(!checkExtensions());11621163GLColor rgbaPixels[27];11641165// Create pixel data for a 3x3x3 red cube1166for (int i = 0; i < 27; i++)1167{1168rgbaPixels[i] = GLColor(255u, 0u, 0u, 255u);1169}11701171// Change a pixel to create a 1x1x1 blue cube at (0, 0, 0)1172rgbaPixels[0] = GLColor(0u, 0u, 255u, 255u);11731174// Change some pixels to green to create a 2x2x2 cube starting at (1, 1, 1)1175rgbaPixels[13] = GLColor(0u, 255u, 0u, 255u);1176rgbaPixels[14] = GLColor(0u, 255u, 0u, 255u);1177rgbaPixels[16] = GLColor(0u, 255u, 0u, 255u);1178rgbaPixels[17] = GLColor(0u, 255u, 0u, 255u);1179rgbaPixels[22] = GLColor(0u, 255u, 0u, 255u);1180rgbaPixels[23] = GLColor(0u, 255u, 0u, 255u);1181rgbaPixels[25] = GLColor(0u, 255u, 0u, 255u);1182rgbaPixels[26] = GLColor(0u, 255u, 0u, 255u);11831184glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());1185glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 3, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE,1186rgbaPixels);1187glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1188glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1189glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);1190glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);1191EXPECT_GL_NO_ERROR();11921193glActiveTexture(GL_TEXTURE0);1194glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());1195glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);1196glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1197glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1198glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);1199glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);1200glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);1201glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);1202glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);12031204EXPECT_GL_NO_ERROR();1205// Copy the 2x2x2 green cube into a new texture1206glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 0, 0,12070, 1, 1, 1, 2, 2, 2, false, false, false);1208glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());1209EXPECT_GL_NO_ERROR();1210drawQuad(mProgram, "position", 1.0f);1211int width = getWindowWidth() - 1;1212int height = getWindowHeight() - 1;12131214EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);1215EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);1216EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);1217EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);12181219// Copy the 1x1x1 blue cube into the the 2x2x2 green cube at location (1, 1, 1)1220glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 1, 1,12211, 0, 0, 0, 1, 1, 1, false, false, false);1222EXPECT_GL_NO_ERROR();1223drawQuad(mProgram, "position", 1.0f);1224EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);1225EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);1226EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);1227EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::blue);1228}12291230// Test that the flipY parameter works with a GL_TEXTURE_2D_ARRAY texture.1231TEST_P(Texture2DArrayCopy, FlipY)1232{1233ANGLE_SKIP_TEST_IF(!checkExtensions());12341235// Create a 2x2x2 cube. The top half is red. The bottom half is green.1236GLColor rgbaPixels[8] = {GLColor::green, GLColor::green, GLColor::red, GLColor::red,1237GLColor::green, GLColor::green, GLColor::red, GLColor::red};12381239glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());1240glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,1241rgbaPixels);1242glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1243glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1244glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);1245glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);1246glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);1247glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);1248glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);12491250drawQuad(mProgram, "position", 1.0f);12511252int width = getWindowWidth() - 1;1253int height = getWindowHeight() - 1;12541255EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);1256EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::red);1257EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::red);1258EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::red);12591260EXPECT_GL_NO_ERROR();12611262glActiveTexture(GL_TEXTURE0);1263glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());1264glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);1265glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1266glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1267glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);1268glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);1269glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);1270glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);1271glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);1272EXPECT_GL_NO_ERROR();12731274// Flip the y coordinate. This will put the greem half on top, and the red half on the bottom.1275glCopyTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, GL_RGBA,1276GL_UNSIGNED_BYTE, true, false, false);12771278glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());1279EXPECT_GL_NO_ERROR();1280drawQuad(mProgram, "position", 1.0f);12811282EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);1283EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);1284EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);1285EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);1286}12871288// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with1289// unsized formats.1290TEST_P(Texture2DArrayCopy, UnsizedFormats)1291{1292ANGLE_SKIP_TEST_IF(!checkExtensions());12931294testUnsizedFormats(GL_TEXTURE_2D_ARRAY);1295}12961297// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with1298// snorm formats.1299TEST_P(Texture2DArrayCopy, SnormFormats)1300{1301ANGLE_SKIP_TEST_IF(!checkExtensions());13021303testSnormFormats(GL_TEXTURE_2D_ARRAY);1304}13051306// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with1307// unsigned byte formats.1308TEST_P(Texture2DArrayCopy, UnsignedByteFormats)1309{1310ANGLE_SKIP_TEST_IF(!checkExtensions());13111312// Flay on Windows D3D11. http://anglebug.com/28961313ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11());13141315testUnsignedByteFormats(GL_TEXTURE_2D_ARRAY);1316}13171318// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with1319// float formats.1320TEST_P(Texture2DArrayCopy, FloatFormats)1321{1322ANGLE_SKIP_TEST_IF(!checkExtensions());13231324// http://anglebug.com/47561325ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());13261327testFloatFormats(GL_TEXTURE_2D_ARRAY);1328}13291330// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with1331// integer formats.1332TEST_P(Texture2DArrayCopy, IntFormats)1333{1334ANGLE_SKIP_TEST_IF(!checkExtensions());13351336// Vulkan multiplies source by 255 unconditionally, which is wrong for signed integer formats.1337// http://anglebug.com/47411338ANGLE_SKIP_TEST_IF(IsVulkan());13391340constexpr char kFS[] =1341"#version 300 es\n"1342"precision highp float;\n"1343"uniform highp isampler2DArray tex2DArray;\n"1344"in vec3 texcoord;\n"1345"out ivec4 fragColor;\n"1346"void main()\n"1347"{\n"1348" fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"1349"}\n";13501351mProgram = CompileProgram(getVertexShaderSource(), kFS);1352ASSERT_NE(0u, mProgram);1353ASSERT_GL_NO_ERROR();13541355glUseProgram(mProgram);13561357testIntFormats(GL_TEXTURE_2D_ARRAY);1358}13591360// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with1361// unsigned integer formats.1362TEST_P(Texture2DArrayCopy, UintFormats)1363{1364ANGLE_SKIP_TEST_IF(!checkExtensions());13651366// Vulkan multiplies source by 255 unconditionally, which is wrong for non-8-bit integer1367// formats. http://anglebug.com/47411368ANGLE_SKIP_TEST_IF(IsVulkan());13691370constexpr char kFS[] =1371"#version 300 es\n"1372"precision highp float;\n"1373"uniform highp usampler2DArray tex2DArray;\n"1374"in vec3 texcoord;\n"1375"out uvec4 fragColor;\n"1376"void main()\n"1377"{\n"1378" fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"1379"}\n";13801381mProgram = CompileProgram(getVertexShaderSource(), kFS);1382ASSERT_NE(0u, mProgram);1383ASSERT_GL_NO_ERROR();13841385glUseProgram(mProgram);13861387testUintFormats(GL_TEXTURE_2D_ARRAY);1388}13891390GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture3DCopy);1391ANGLE_INSTANTIATE_TEST_ES3(Texture3DCopy);13921393GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DArrayCopy);1394ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayCopy);13951396} // namespace angle139713981399