Path: blob/main_old/src/tests/gl_tests/CopyTextureTest.cpp
1693 views
//1// Copyright 2016 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// CopyTextureTest.cpp: Tests of the GL_CHROMIUM_copy_texture extension78#include "test_utils/ANGLETest.h"910#include "test_utils/gl_raii.h"1112namespace angle13{1415class CopyTextureTest : public ANGLETest16{17protected:18CopyTextureTest()19{20setWindowWidth(256);21setWindowHeight(256);22setConfigRedBits(8);23setConfigGreenBits(8);24setConfigBlueBits(8);25setConfigAlphaBits(8);26}2728void testSetUp() override29{30glGenTextures(2, mTextures);31glBindTexture(GL_TEXTURE_2D, mTextures[1]);3233glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);34glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);35glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);36glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);3738glGenFramebuffers(1, &mFramebuffer);39glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);40glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],410);42}4344void testTearDown() override45{46glDeleteTextures(2, mTextures);47glDeleteFramebuffers(1, &mFramebuffer);48}4950bool checkExtensions() const51{52if (!IsGLExtensionEnabled("GL_CHROMIUM_copy_texture"))53{54std::cout << "Test skipped because GL_CHROMIUM_copy_texture is not available."55<< std::endl;56return false;57}5859EXPECT_NE(nullptr, glCopyTextureCHROMIUM);60EXPECT_NE(nullptr, glCopySubTextureCHROMIUM);61return true;62}6364void testGradientDownsampleUniqueValues(GLenum destFormat,65GLenum destType,66const std::array<size_t, 4> &expectedUniqueValues)67{68std::array<GLColor, 256> sourceGradient;69for (size_t i = 0; i < sourceGradient.size(); i++)70{71GLubyte value = static_cast<GLubyte>(i);72sourceGradient[i] = GLColor(value, value, value, value);73}74GLTexture sourceTexture;75glBindTexture(GL_TEXTURE_2D, sourceTexture);76glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,77sourceGradient.data());7879GLTexture destTexture;80glBindTexture(GL_TEXTURE_2D, destTexture);81glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destFormat, destType,82GL_FALSE, GL_FALSE, GL_FALSE);83EXPECT_GL_NO_ERROR();8485GLFramebuffer fbo;86glBindFramebuffer(GL_FRAMEBUFFER, fbo);87glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0);8889std::array<GLColor, 256> destData;90glReadPixels(0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE, destData.data());91EXPECT_GL_NO_ERROR();9293std::set<GLubyte> uniqueValues[4];94for (size_t i = 0; i < destData.size(); i++)95{96GLColor color = destData[i];97uniqueValues[0].insert(color.R);98uniqueValues[1].insert(color.G);99uniqueValues[2].insert(color.B);100uniqueValues[3].insert(color.A);101}102103EXPECT_EQ(expectedUniqueValues[0], uniqueValues[0].size());104EXPECT_EQ(expectedUniqueValues[1], uniqueValues[1].size());105EXPECT_EQ(expectedUniqueValues[2], uniqueValues[2].size());106EXPECT_EQ(expectedUniqueValues[3], uniqueValues[3].size());107}108109GLuint mTextures[2] = {1100,1110,112};113GLuint mFramebuffer = 0;114};115116using CopyTextureVariationsTestParams =117std::tuple<angle::PlatformParameters, GLenum, GLenum, bool, bool, bool>;118119std::string CopyTextureVariationsTestPrint(120const ::testing::TestParamInfo<CopyTextureVariationsTestParams> ¶msInfo)121{122const CopyTextureVariationsTestParams ¶ms = paramsInfo.param;123std::ostringstream out;124125out << std::get<0>(params) << "__";126127switch (std::get<1>(params))128{129case GL_ALPHA:130out << "A";131break;132case GL_RGB:133out << "RGB";134break;135case GL_RGBA:136out << "RGBA";137break;138case GL_LUMINANCE:139out << "L";140break;141case GL_LUMINANCE_ALPHA:142out << "LA";143break;144case GL_BGRA_EXT:145out << "BGRA";146break;147case GL_SRGB_ALPHA_EXT:148out << "SRGBA";149break;150default:151out << "UPDATE_THIS_SWITCH";152}153154out << "To";155156switch (std::get<2>(params))157{158case GL_RGB:159out << "RGB";160break;161case GL_RGBA:162out << "RGBA";163break;164case GL_BGRA_EXT:165out << "BGRA";166break;167case GL_SRGB_ALPHA_EXT:168out << "SRGBA";169break;170default:171out << "UPDATE_THIS_SWITCH";172}173174if (std::get<3>(params))175{176out << "FlipY";177}178if (std::get<4>(params))179{180out << "PremultiplyAlpha";181}182if (std::get<5>(params))183{184out << "UnmultiplyAlpha";185}186187return out.str();188}189190class CopyTextureVariationsTest : public ANGLETestWithParam<CopyTextureVariationsTestParams>191{192protected:193CopyTextureVariationsTest()194{195setWindowWidth(256);196setWindowHeight(256);197setConfigRedBits(8);198setConfigGreenBits(8);199setConfigBlueBits(8);200setConfigAlphaBits(8);201}202203void testSetUp() override204{205glGenTextures(2, mTextures);206glBindTexture(GL_TEXTURE_2D, mTextures[1]);207208glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);209glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);210glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);211glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);212213glGenFramebuffers(1, &mFramebuffer);214glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);215glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],2160);217}218219void testTearDown() override220{221glDeleteTextures(2, mTextures);222glDeleteFramebuffers(1, &mFramebuffer);223}224225bool checkExtensions(GLenum sourceFormat, GLenum destFormat) const226{227if (!IsGLExtensionEnabled("GL_CHROMIUM_copy_texture"))228{229std::cout << "Test skipped because GL_CHROMIUM_copy_texture is not available."230<< std::endl;231return false;232}233234if ((sourceFormat == GL_BGRA_EXT || destFormat == GL_BGRA_EXT) &&235!IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))236{237return false;238}239240if ((sourceFormat == GL_SRGB_ALPHA_EXT || destFormat == GL_SRGB_ALPHA_EXT) &&241!IsGLExtensionEnabled("GL_EXT_sRGB"))242{243return false;244}245246return true;247}248249void calculateCopyTextureResults(GLenum sourceFormat,250GLenum destFormat,251bool premultiplyAlpha,252bool unmultiplyAlpha,253const uint8_t *sourceColor,254GLColor *destColor)255{256GLColor color;257258switch (sourceFormat)259{260case GL_RGB:261color = GLColor(sourceColor[0], sourceColor[1], sourceColor[2], 255);262break;263case GL_RGBA:264color = GLColor(sourceColor[0], sourceColor[1], sourceColor[2], sourceColor[3]);265break;266case GL_LUMINANCE:267color = GLColor(sourceColor[0], sourceColor[0], sourceColor[0], 255);268break;269case GL_ALPHA:270color = GLColor(0, 0, 0, sourceColor[0]);271break;272case GL_LUMINANCE_ALPHA:273color = GLColor(sourceColor[0], sourceColor[0], sourceColor[0], sourceColor[1]);274break;275case GL_BGRA_EXT:276color = GLColor(sourceColor[2], sourceColor[1], sourceColor[0], sourceColor[3]);277break;278default:279EXPECT_EQ(true, false);280}281282if (premultiplyAlpha != unmultiplyAlpha)283{284float alpha = color.A / 255.0f;285if (premultiplyAlpha)286{287color.R = static_cast<GLubyte>(static_cast<float>(color.R) * alpha);288color.G = static_cast<GLubyte>(static_cast<float>(color.G) * alpha);289color.B = static_cast<GLubyte>(static_cast<float>(color.B) * alpha);290}291else if (unmultiplyAlpha && color.A != 0)292{293color.R = static_cast<GLubyte>(static_cast<float>(color.R) / alpha);294color.G = static_cast<GLubyte>(static_cast<float>(color.G) / alpha);295color.B = static_cast<GLubyte>(static_cast<float>(color.B) / alpha);296}297}298299switch (destFormat)300{301case GL_RGB:302color.A = 255;303break;304case GL_RGBA:305case GL_BGRA_EXT:306case GL_SRGB_ALPHA_EXT:307break;308default:309EXPECT_EQ(true, false);310}311312*destColor = color;313}314315const uint8_t *getSourceColors(GLenum sourceFormat, size_t *colorCount, uint8_t *componentCount)316{317// Note: in all the following values, alpha is larger than RGB so unmultiply alpha doesn't318// overflow319constexpr static uint8_t kRgbaColors[7 * 4] = {320255u, 127u, 63u, 255u, // 032131u, 127u, 63u, 127u, // 132231u, 63u, 127u, 255u, // 232315u, 127u, 31u, 127u, // 3324127u, 255u, 63u, 0u, // 432531u, 63u, 127u, 0u, // 532615u, 31u, 63u, 63u, // 6327};328329constexpr static uint8_t kRgbColors[7 * 3] = {330255u, 127u, 63u, // 033131u, 127u, 63u, // 133231u, 63u, 127u, // 233315u, 127u, 31u, // 3334127u, 255u, 63u, // 433531u, 63u, 127u, // 533615u, 31u, 63u, // 6337};338339constexpr static uint8_t kLumColors[7 * 1] = {340255u, // 0341163u, // 134278u, // 2343114u, // 334451u, // 43450u, // 5346217u, // 6347};348349constexpr static uint8_t kLumaColors[7 * 2] = {350255u, 255u, // 035167u, 163u, // 135278u, 231u, // 23538u, 114u, // 335451u, 199u, // 43550u, 173u, // 535634u, 217u, // 6357};358359constexpr static uint8_t kAlphaColors[7 * 1] = {360255u, // 036167u, // 1362231u, // 23638u, // 3364199u, // 4365173u, // 536634u, // 6367};368369*colorCount = 7;370371switch (sourceFormat)372{373case GL_RGB:374*componentCount = 3;375return kRgbColors;376case GL_RGBA:377case GL_BGRA_EXT:378*componentCount = 4;379return kRgbaColors;380case GL_LUMINANCE:381*componentCount = 1;382return kLumColors;383case GL_ALPHA:384*componentCount = 1;385return kAlphaColors;386case GL_LUMINANCE_ALPHA:387*componentCount = 2;388return kLumaColors;389default:390EXPECT_EQ(true, false);391return nullptr;392}393}394395void initializeSourceTexture(GLenum target,396GLenum sourceFormat,397const uint8_t *srcColors,398uint8_t componentCount)399{400// The texture is initialized as 2x2. If the componentCount is 1 or 3, then the input data401// will have a row pitch of 2 or 6, which needs to be padded to 4 or 8 respectively.402uint8_t srcColorsPadded[4 * 4];403size_t srcRowPitch =4042 * componentCount + (componentCount == 1 || componentCount == 3 ? 2 : 0);405size_t inputRowPitch = 2 * componentCount;406for (size_t row = 0; row < 2; ++row)407{408memcpy(&srcColorsPadded[row * srcRowPitch], &srcColors[row * inputRowPitch],409inputRowPitch);410memset(&srcColorsPadded[row * srcRowPitch + inputRowPitch], 0,411srcRowPitch - inputRowPitch);412}413414glBindTexture(target, mTextures[0]);415glTexImage2D(target, 0, sourceFormat, 2, 2, 0, sourceFormat, GL_UNSIGNED_BYTE,416srcColorsPadded);417}418419void testCopyTexture(GLenum sourceTarget,420GLenum sourceFormat,421GLenum destFormat,422bool flipY,423bool premultiplyAlpha,424bool unmultiplyAlpha)425{426if (!checkExtensions(sourceFormat, destFormat))427{428return;429}430431if (sourceFormat == GL_LUMINANCE || sourceFormat == GL_LUMINANCE_ALPHA ||432sourceFormat == GL_ALPHA || destFormat == GL_LUMINANCE ||433destFormat == GL_LUMINANCE_ALPHA || destFormat == GL_ALPHA)434{435// Old drivers buggy with optimized ImageCopy shader given LUMA textures.436// http://anglebug.com/4721437ANGLE_SKIP_TEST_IF(IsLinux() && IsNVIDIA() && IsVulkan());438439// http://anglebug.com/4939440ANGLE_SKIP_TEST_IF(IsOpenGL() && destFormat == GL_SRGB_ALPHA_EXT);441}442443size_t colorCount;444uint8_t componentCount;445const uint8_t *srcColors = getSourceColors(sourceFormat, &colorCount, &componentCount);446447std::vector<GLColor> destColors(colorCount);448for (size_t i = 0; i < colorCount; ++i)449{450calculateCopyTextureResults(sourceFormat, destFormat, premultiplyAlpha, unmultiplyAlpha,451&srcColors[i * componentCount], &destColors[i]);452}453454for (size_t i = 0; i < colorCount - 3; ++i)455{456initializeSourceTexture(sourceTarget, sourceFormat, &srcColors[i * componentCount],457componentCount);458459glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,460GL_UNSIGNED_BYTE, flipY, premultiplyAlpha, unmultiplyAlpha);461462EXPECT_GL_NO_ERROR();463464// Check that FB is complete.465EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));466467if (flipY)468{469EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);470EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);471EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);472EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);473}474else475{476EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);477EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);478EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);479EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);480}481482EXPECT_GL_NO_ERROR();483}484}485486void testCopySubTexture(GLenum sourceTarget,487GLenum sourceFormat,488GLenum destFormat,489bool flipY,490bool premultiplyAlpha,491bool unmultiplyAlpha)492{493if (!checkExtensions(sourceFormat, destFormat))494{495return;496}497498if (sourceFormat == GL_LUMINANCE || sourceFormat == GL_LUMINANCE_ALPHA ||499sourceFormat == GL_ALPHA || destFormat == GL_LUMINANCE ||500destFormat == GL_LUMINANCE_ALPHA || destFormat == GL_ALPHA)501{502// Old drivers buggy with optimized ImageCopy shader given LUMA textures.503// http://anglebug.com/4721504ANGLE_SKIP_TEST_IF(IsLinux() && IsNVIDIA() && IsVulkan());505506// http://anglebug.com/4939507ANGLE_SKIP_TEST_IF(IsOpenGL() && destFormat == GL_SRGB_ALPHA_EXT);508}509510size_t colorCount;511uint8_t componentCount;512const uint8_t *srcColors = getSourceColors(sourceFormat, &colorCount, &componentCount);513514std::vector<GLColor> destColors(colorCount);515for (size_t i = 0; i < colorCount; ++i)516{517calculateCopyTextureResults(sourceFormat, destFormat, premultiplyAlpha, unmultiplyAlpha,518&srcColors[i * componentCount], &destColors[i]);519}520521for (size_t i = 0; i < colorCount - 3; ++i)522{523initializeSourceTexture(sourceTarget, sourceFormat, &srcColors[i * componentCount],524componentCount);525526glBindTexture(GL_TEXTURE_2D, mTextures[1]);527glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 2, 2, 0, destFormat, GL_UNSIGNED_BYTE,528nullptr);529530glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 2,5312, flipY, premultiplyAlpha, unmultiplyAlpha);532533EXPECT_GL_NO_ERROR();534535if (sourceFormat != GL_LUMINANCE && sourceFormat != GL_LUMINANCE_ALPHA &&536sourceFormat != GL_ALPHA)537{538// Check that FB is complete.539EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));540}541542if (flipY)543{544EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);545EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);546EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);547EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);548}549else550{551EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);552EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);553EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);554EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);555}556557EXPECT_GL_NO_ERROR();558}559}560561GLuint mTextures[2] = {5620,5630,564};565GLuint mFramebuffer = 0;566};567568class CopyTextureTestDest : public CopyTextureTest569{};570571class CopyTextureTestWebGL : public CopyTextureTest572{573protected:574CopyTextureTestWebGL() : CopyTextureTest() { setWebGLCompatibilityEnabled(true); }575};576577class CopyTextureTestES3 : public CopyTextureTest578{579protected:580void invalidateBlitThenBlendCommon(GLsizei layerCount);581};582583// Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to584// immutable textures585TEST_P(CopyTextureTest, ImmutableTexture)586{587if (!checkExtensions())588{589return;590}591592ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&593(!IsGLExtensionEnabled("GL_EXT_texture_storage") ||594!IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));595596GLColor pixels = GLColor::red;597598glBindTexture(GL_TEXTURE_2D, mTextures[0]);599glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);600glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);601602glBindTexture(GL_TEXTURE_2D, mTextures[1]);603glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);604glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);605EXPECT_GL_NO_ERROR();606607// Should generate an error when the texture is redefined608glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,609GL_UNSIGNED_BYTE, false, false, false);610EXPECT_GL_ERROR(GL_INVALID_OPERATION);611612// Should succeed when using CopySubTexture613glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,614false, false, false);615EXPECT_GL_NO_ERROR();616617// Check that FB is complete.618EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));619620EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);621622EXPECT_GL_NO_ERROR();623}624625// Test validation of internal formats in CopyTexture and CopySubTexture626TEST_P(CopyTextureTest, InternalFormat)627{628if (!checkExtensions())629{630return;631}632633std::vector<GLint> sourceFormats;634sourceFormats.push_back(GL_ALPHA);635sourceFormats.push_back(GL_RGB);636sourceFormats.push_back(GL_RGBA);637sourceFormats.push_back(GL_LUMINANCE);638sourceFormats.push_back(GL_LUMINANCE_ALPHA);639640std::vector<GLint> destFormats;641destFormats.push_back(GL_RGB);642destFormats.push_back(GL_RGBA);643644if (IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))645{646sourceFormats.push_back(GL_BGRA_EXT);647destFormats.push_back(GL_BGRA_EXT);648}649650// Test with glCopyTexture651for (GLint sourceFormat : sourceFormats)652{653for (GLint destFormat : destFormats)654{655glBindTexture(GL_TEXTURE_2D, mTextures[0]);656glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,657nullptr);658EXPECT_GL_NO_ERROR();659660glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,661GL_UNSIGNED_BYTE, false, false, false);662663EXPECT_GL_NO_ERROR();664}665}666667// Test with glCopySubTexture668for (GLint sourceFormat : sourceFormats)669{670for (GLint destFormat : destFormats)671{672glBindTexture(GL_TEXTURE_2D, mTextures[0]);673glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,674nullptr);675EXPECT_GL_NO_ERROR();676677glBindTexture(GL_TEXTURE_2D, mTextures[1]);678glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 1, 1, 0, destFormat, GL_UNSIGNED_BYTE,679nullptr);680EXPECT_GL_NO_ERROR();681682glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1,6831, false, false, false);684685EXPECT_GL_NO_ERROR();686}687}688}689690// Test to ensure that the destination texture is redefined if the properties are different.691TEST_P(CopyTextureTest, RedefineDestinationTexture)692{693ANGLE_SKIP_TEST_IF(!checkExtensions());694ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"));695696GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};697698glBindTexture(GL_TEXTURE_2D, mTextures[0]);699glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);700701glBindTexture(GL_TEXTURE_2D, mTextures[1]);702glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);703EXPECT_GL_NO_ERROR();704705// GL_INVALID_OPERATION due to "intrinsic format" != "internal format".706glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);707EXPECT_GL_ERROR(GL_INVALID_OPERATION);708// GL_INVALID_VALUE due to bad dimensions.709glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);710EXPECT_GL_ERROR(GL_INVALID_VALUE);711712// If the dest texture has different properties, glCopyTextureCHROMIUM()713// redefines them.714glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,715GL_UNSIGNED_BYTE, false, false, false);716EXPECT_GL_NO_ERROR();717718// glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2719// dimension and GL_RGBA format.720glBindTexture(GL_TEXTURE_2D, mTextures[1]);721glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);722EXPECT_GL_NO_ERROR();723724// Check that FB is complete.725EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));726727EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]);728EXPECT_GL_NO_ERROR();729}730731// Test that invalid dimensions in CopySubTexture are validated732TEST_P(CopyTextureTest, CopySubTextureDimension)733{734if (!checkExtensions())735{736return;737}738739glBindTexture(GL_TEXTURE_2D, mTextures[0]);740glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);741742glBindTexture(GL_TEXTURE_2D, mTextures[1]);743glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);744745glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,746false, false, false);747EXPECT_GL_NO_ERROR();748749// xoffset < 0750glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, -1, 1, 0, 0, 1, 1,751false, false, false);752EXPECT_GL_ERROR(GL_INVALID_VALUE);753754// x < 0755glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, -1, 0, 1, 1,756false, false, false);757EXPECT_GL_ERROR(GL_INVALID_VALUE);758759// xoffset + width > dest_width760glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 2, 2, 0, 0, 2, 2,761false, false, false);762EXPECT_GL_ERROR(GL_INVALID_VALUE);763764// x + width > source_width765glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 1, 1, 2, 2,766false, false, false);767EXPECT_GL_ERROR(GL_INVALID_VALUE);768}769770// Test that invalid IDs in CopyTexture are validated771TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds)772{773if (!checkExtensions())774{775return;776}777778glBindTexture(GL_TEXTURE_2D, mTextures[0]);779glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);780781glBindTexture(GL_TEXTURE_2D, mTextures[1]);782glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);783784glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, GL_RGBA, GL_UNSIGNED_BYTE,785false, false, false);786EXPECT_GL_ERROR(GL_INVALID_VALUE);787788glCopyTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA, GL_UNSIGNED_BYTE,789false, false, false);790EXPECT_GL_ERROR(GL_INVALID_VALUE);791792glCopyTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, GL_RGBA, GL_UNSIGNED_BYTE, false,793false, false);794EXPECT_GL_ERROR(GL_INVALID_VALUE);795796glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,797GL_UNSIGNED_BYTE, false, false, false);798EXPECT_GL_NO_ERROR();799}800801// Test that invalid IDs in CopySubTexture are validated802TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)803{804if (!checkExtensions())805{806return;807}808809glBindTexture(GL_TEXTURE_2D, mTextures[0]);810glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);811812glBindTexture(GL_TEXTURE_2D, mTextures[1]);813glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);814815glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, 1, 1, 0, 0, 1, 1, false,816false, false);817EXPECT_GL_ERROR(GL_INVALID_VALUE);818819glCopySubTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1, false,820false, false);821EXPECT_GL_ERROR(GL_INVALID_VALUE);822823glCopySubTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, 1, 1, 0, 0, 1, 1, false, false,824false);825EXPECT_GL_ERROR(GL_INVALID_VALUE);826827glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,828false, false, false);829EXPECT_GL_NO_ERROR();830}831832TEST_P(CopyTextureTest, InvalidTarget)833{834ANGLE_SKIP_TEST_IF(!checkExtensions());835836GLTexture textures[2];837838glBindTexture(GL_TEXTURE_2D, textures[0]);839glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);840841glBindTexture(GL_TEXTURE_2D, textures[1]);842glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);843844// Invalid enum for a completely invalid target845glCopySubTextureCHROMIUM(textures[0], 0, GL_INVALID_VALUE, textures[1], 0, 1, 1, 0, 0, 1, 1,846false, false, false);847EXPECT_GL_ERROR(GL_INVALID_ENUM);848849// Invalid value for a valid target enum but is not valid for the destination texture850glCopySubTextureCHROMIUM(textures[0], 0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textures[1], 0, 1, 1,8510, 0, 1, 1, false, false, false);852EXPECT_GL_ERROR(GL_INVALID_VALUE);853}854855// Test that using an offset in CopySubTexture works correctly856TEST_P(CopyTextureTest, CopySubTextureOffset)857{858if (!checkExtensions())859{860return;861}862863GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};864glBindTexture(GL_TEXTURE_2D, mTextures[0]);865glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);866867GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack,868GLColor::transparentBlack, GLColor::transparentBlack};869glBindTexture(GL_TEXTURE_2D, mTextures[1]);870glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels);871872// Check that FB is complete.873EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));874875glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,876false, false, false);877EXPECT_GL_NO_ERROR();878EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);879880glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 0, 1, 0, 1, 1,881false, false, false);882EXPECT_GL_NO_ERROR();883EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);884885glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 1, 0, 1, 1, 1,886false, false, false);887EXPECT_GL_NO_ERROR();888EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);889890EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);891EXPECT_GL_NO_ERROR();892}893894// Test every combination of copy [sub]texture parameters:895// source: ALPHA, RGB, RGBA, LUMINANCE, LUMINANCE_ALPHA, BGRA_EXT896// destination: RGB, RGBA, BGRA_EXT897// flipY: false, true898// premultiplyAlpha: false, true899// unmultiplyAlpha: false, true900namespace901{902constexpr GLenum kCopyTextureVariationsSrcFormats[] = {903GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT};904constexpr GLenum kCopyTextureVariationsDstFormats[] = {GL_RGB, GL_RGBA, GL_BGRA_EXT,905GL_SRGB_ALPHA_EXT};906} // anonymous namespace907908TEST_P(CopyTextureVariationsTest, CopyTexture)909{910// http://anglebug.com/5723911ANGLE_SKIP_TEST_IF(IsOzone());912// http://anglebug.com/5246913if (std::get<1>(GetParam()) == GL_ALPHA && std::get<2>(GetParam()) == GL_RGB &&914std::get<3>(GetParam()) && std::get<5>(GetParam()))915{916ANGLE_SKIP_TEST_IF(IsWindows7() && IsNVIDIA() && IsOpenGLES());917}918919testCopyTexture(GL_TEXTURE_2D, std::get<1>(GetParam()), std::get<2>(GetParam()),920std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()));921}922923TEST_P(CopyTextureVariationsTest, CopySubTexture)924{925// http://anglebug.com/5723926ANGLE_SKIP_TEST_IF(IsOzone());927testCopySubTexture(GL_TEXTURE_2D, std::get<1>(GetParam()), std::get<2>(GetParam()),928std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()));929}930931TEST_P(CopyTextureVariationsTest, CopyTextureRectangle)932{933ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_rectangle"));934935testCopyTexture(GL_TEXTURE_RECTANGLE_ANGLE, std::get<1>(GetParam()), std::get<2>(GetParam()),936std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()));937}938939TEST_P(CopyTextureVariationsTest, CopySubTextureRectangle)940{941ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_rectangle"));942943testCopySubTexture(GL_TEXTURE_RECTANGLE_ANGLE, std::get<1>(GetParam()), std::get<2>(GetParam()),944std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()));945}946947// Test that copying to cube maps works948TEST_P(CopyTextureTest, CubeMapTarget)949{950if (!checkExtensions())951{952return;953}954955// http://anglebug.com/1932956ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel() && IsDesktopOpenGL());957958// http://anglebug.com/3145959ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());960961GLColor pixels[7] = {962GLColor(10u, 13u, 16u, 19u), GLColor(20u, 23u, 26u, 29u), GLColor(30u, 33u, 36u, 39u),963GLColor(40u, 43u, 46u, 49u), GLColor(50u, 53u, 56u, 59u), GLColor(60u, 63u, 66u, 69u),964GLColor(70u, 73u, 76u, 79u),965};966967GLTexture textures[2];968969glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);970for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;971face++)972{973glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);974}975976for (size_t i = 0; i < 2; ++i)977{978for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;979face++)980{981glBindTexture(GL_TEXTURE_2D, textures[0]);982glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,983&pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);984985glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 1, 1, false,986false, false);987}988989EXPECT_GL_NO_ERROR();990991GLFramebuffer fbo;992glBindFramebuffer(GL_FRAMEBUFFER, fbo);993994for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;995face++)996{997glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);998999// Check that FB is complete.1000EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));10011002EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);10031004EXPECT_GL_NO_ERROR();1005}1006}1007}10081009// Test that we can successfully copy into incomplete cube maps. Regression test for1010// http://anglebug.com/33841011TEST_P(CopyTextureTest, IncompleteCubeMap)1012{1013if (!checkExtensions())1014{1015return;1016}10171018GLTexture texture2D;1019GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};1020glBindTexture(GL_TEXTURE_2D, texture2D);1021glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);10221023GLTexture textureCube;1024glBindTexture(GL_TEXTURE_CUBE_MAP, textureCube);1025for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;1026face++)1027{1028glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);1029}10301031// Set one face to 2x21032glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,1033rgbaPixels);10341035// Copy into the incomplete face1036glCopySubTextureCHROMIUM(texture2D, 0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, textureCube, 0, 0, 0, 0,10370, 2, 2, false, false, false);1038EXPECT_GL_NO_ERROR();1039}10401041// Test BGRA to RGBA cube map copy1042TEST_P(CopyTextureTest, CubeMapTargetBGRA)1043{1044if (!checkExtensions())1045{1046return;1047}10481049if (!IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))1050{1051return;1052}10531054// http://anglebug.com/31451055ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());10561057GLColor pixels[7] = {1058GLColor(10u, 13u, 16u, 19u), GLColor(20u, 23u, 26u, 29u), GLColor(30u, 33u, 36u, 39u),1059GLColor(40u, 43u, 46u, 49u), GLColor(50u, 53u, 56u, 59u), GLColor(60u, 63u, 66u, 69u),1060GLColor(70u, 73u, 76u, 79u),1061};10621063GLTexture textures[2];10641065glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);1066for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;1067face++)1068{1069glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);1070}10711072for (size_t i = 0; i < 2; ++i)1073{1074for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;1075face++)1076{1077glBindTexture(GL_TEXTURE_2D, textures[0]);1078glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,1079&pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);10801081glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 1, 1, false,1082false, false);1083}10841085EXPECT_GL_NO_ERROR();10861087GLFramebuffer fbo;1088glBindFramebuffer(GL_FRAMEBUFFER, fbo);10891090for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;1091face++)1092{1093glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);10941095// Check that FB is complete.1096EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));10971098GLColor converted = pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i];1099std::swap(converted.R, converted.B);1100EXPECT_PIXEL_COLOR_EQ(0, 0, converted);11011102EXPECT_GL_NO_ERROR();1103}1104}1105}11061107// Test cube map copies with RGB format1108TEST_P(CopyTextureTest, CubeMapTargetRGB)1109{1110if (!checkExtensions())1111{1112return;1113}11141115// http://anglebug.com/19321116ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel() && IsDesktopOpenGL());11171118// http://anglebug.com/31451119ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());11201121constexpr uint8_t pixels[16 * 7] = {11220u, 3u, 6u, 10u, 13u, 16u, 0, 0, 20u, 23u, 26u, 30u, 33u, 36u, 0, 0, // 2x2112340u, 43u, 46u, 50u, 53u, 56u, 0, 0, 60u, 63u, 66u, 70u, 73u, 76u, 0, 0, // 2x2112480u, 83u, 86u, 90u, 93u, 96u, 0, 0, 100u, 103u, 106u, 110u, 113u, 116u, 0, 0, // 2x21125120u, 123u, 126u, 130u, 133u, 136u, 0, 0, 140u, 143u, 146u, 160u, 163u, 166u, 0, 0, // 2x21126170u, 173u, 176u, 180u, 183u, 186u, 0, 0, 190u, 193u, 196u, 200u, 203u, 206u, 0, 0, // 2x21127210u, 213u, 216u, 220u, 223u, 226u, 0, 0, 230u, 233u, 236u, 240u, 243u, 246u, 0, 0, // 2x2112810u, 50u, 100u, 30u, 80u, 130u, 0, 0, 60u, 110u, 160u, 90u, 140u, 200u, 0, 0, // 2x21129};11301131GLTexture textures[2];11321133glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);1134for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;1135face++)1136{1137glTexImage2D(face, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);1138}11391140for (size_t i = 0; i < 2; ++i)1141{1142for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;1143face++)1144{1145glBindTexture(GL_TEXTURE_2D, textures[0]);1146glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,1147&pixels[(face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i) * 16]);11481149glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 2, 2, false,1150false, false);1151}11521153EXPECT_GL_NO_ERROR();11541155GLFramebuffer fbo;1156glBindFramebuffer(GL_FRAMEBUFFER, fbo);11571158for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;1159face++)1160{1161glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);11621163// Check that FB is complete.1164EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));11651166const uint8_t *faceData = &pixels[(face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i) * 16];1167EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(faceData[0], faceData[1], faceData[2], 255));1168EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor(faceData[3], faceData[4], faceData[5], 255));1169EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor(faceData[8], faceData[9], faceData[10], 255));1170EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor(faceData[11], faceData[12], faceData[13], 255));11711172EXPECT_GL_NO_ERROR();1173}1174}1175}11761177// Test that copying to non-zero mipmaps works1178TEST_P(CopyTextureTest, CopyToMipmap)1179{1180if (!checkExtensions())1181{1182return;1183}11841185ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&1186!IsGLExtensionEnabled("GL_OES_fbo_render_mipmap"));11871188ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel());11891190GLColor pixels[] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};11911192GLTexture textures[2];11931194glBindTexture(GL_TEXTURE_2D, textures[0]);1195glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);1196glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);11971198glBindTexture(GL_TEXTURE_2D, textures[1]);1199glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);1200glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);1201glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);12021203std::vector<std::pair<GLint, GLint>> soureDestPairs;1204soureDestPairs.push_back(std::make_pair(0, 1));12051206// ES3 allows copying from non-zero mips1207if (getClientMajorVersion() >= 3)1208{1209soureDestPairs.push_back(std::make_pair(1, 2));1210}12111212for (const auto &sourceDestPair : soureDestPairs)1213{1214const GLint sourceLevel = sourceDestPair.first;1215const GLint destLevel = sourceDestPair.second;12161217glCopyTextureCHROMIUM(textures[0], sourceLevel, GL_TEXTURE_2D, textures[1], destLevel,1218GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);12191220EXPECT_GL_NO_ERROR();12211222GLFramebuffer fbo;1223glBindFramebuffer(GL_FRAMEBUFFER, fbo);1224glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],1225destLevel);12261227// Check that FB is complete.1228EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));12291230EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[0]);12311232EXPECT_GL_NO_ERROR();1233}1234}12351236// Test that copying outside the mipmap range works1237TEST_P(CopyTextureTest, CopyOutsideMipmap)1238{1239if (!checkExtensions())1240{1241return;1242}12431244// http://anglebug.com/47161245ANGLE_SKIP_TEST_IF(IsD3D());12461247// Failing on older drivers. http://anglebug.com/47181248ANGLE_SKIP_TEST_IF(IsLinux() && IsNVIDIA() && IsOpenGL());12491250// http://anglebug.com/52461251ANGLE_SKIP_TEST_IF(IsWindows7() && IsNVIDIA() && IsOpenGLES());12521253glBindFramebuffer(GL_FRAMEBUFFER, 0);12541255ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());1256glUseProgram(program);1257GLint textureLoc = glGetUniformLocation(program, essl1_shaders::Texture2DUniform());1258ASSERT_NE(-1, textureLoc);1259glUniform1i(textureLoc, 0);12601261GLTexture textures[2];12621263// Create two single-mip textures.1264glActiveTexture(GL_TEXTURE0);1265glBindTexture(GL_TEXTURE_2D, textures[0]);1266glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);1267glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);1268glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);12691270glBindTexture(GL_TEXTURE_2D, textures[1]);1271glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);1272glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);1273glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);12741275// Commit texture 01276glBindTexture(GL_TEXTURE_2D, textures[0]);1277drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);1278ASSERT_GL_NO_ERROR();1279EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);12801281// Copy texture 1 into mip 1 of texture 0. This mip is outside the range of the image allocated1282// for texture 0.1283glCopyTextureCHROMIUM(textures[1], 0, GL_TEXTURE_2D, textures[0], 1, GL_RGBA, GL_UNSIGNED_BYTE,1284false, false, false);1285EXPECT_GL_NO_ERROR();12861287// Draw with texture 0 again1288drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);1289ASSERT_GL_NO_ERROR();1290EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);1291}12921293// Test that copying from an RGBA8 texture to RGBA4 results in exactly 4-bit precision in the result1294TEST_P(CopyTextureTest, DownsampleRGBA4444)1295{1296// Downsampling on copy is only guarenteed on D3D111297ANGLE_SKIP_TEST_IF(!IsD3D11());12981299GLTexture textures[2];13001301GLColor pixels[] = {GLColor(0, 5, 6, 7), GLColor(17, 22, 25, 24), GLColor(34, 35, 36, 36),1302GLColor(51, 53, 55, 55)};13031304glBindTexture(GL_TEXTURE_2D, textures[0]);1305glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);13061307glBindTexture(GL_TEXTURE_2D, textures[1]);1308glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGBA,1309GL_UNSIGNED_SHORT_4_4_4_4, GL_FALSE, GL_FALSE, GL_FALSE);13101311GLFramebuffer fbo;1312glBindFramebuffer(GL_FRAMEBUFFER, fbo);1313glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);13141315EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 0), 1.0);1316EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(17, 17, 17, 17), 1.0);1317EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(34, 34, 34, 34), 1.0);1318EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(51, 51, 51, 51), 1.0);13191320testGradientDownsampleUniqueValues(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, {16, 16, 16, 16});1321}13221323// Test that copying from an RGBA8 texture to RGB565 results in exactly 4-bit precision in the1324// result1325TEST_P(CopyTextureTest, DownsampleRGB565)1326{1327// Downsampling on copy is only guarenteed on D3D111328ANGLE_SKIP_TEST_IF(!IsD3D11());13291330GLTexture textures[2];13311332GLColor pixels[] = {GLColor(0, 5, 2, 14), GLColor(17, 22, 25, 30), GLColor(34, 33, 36, 46),1333GLColor(50, 54, 49, 60)};13341335glBindTexture(GL_TEXTURE_2D, textures[0]);1336glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);13371338glBindTexture(GL_TEXTURE_2D, textures[1]);1339glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGB,1340GL_UNSIGNED_SHORT_5_6_5, GL_FALSE, GL_FALSE, GL_FALSE);13411342GLFramebuffer fbo;1343glBindFramebuffer(GL_FRAMEBUFFER, fbo);1344glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);13451346EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 4, 0, 255), 1.0);1347EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(16, 20, 25, 255), 1.0);1348EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(33, 32, 33, 255), 1.0);1349EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(49, 53, 49, 255), 1.0);13501351testGradientDownsampleUniqueValues(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, {32, 64, 32, 1});1352}13531354// Test that copying from an RGBA8 texture to RGBA5551 results in exactly 4-bit precision in the1355// result1356TEST_P(CopyTextureTest, DownsampleRGBA5551)1357{1358// Downsampling on copy is only guarenteed on D3D111359ANGLE_SKIP_TEST_IF(!IsD3D11());13601361GLTexture textures[2];13621363GLColor pixels[] = {GLColor(0, 1, 2, 3), GLColor(14, 16, 17, 18), GLColor(33, 34, 36, 46),1364GLColor(50, 51, 52, 255)};13651366glBindTexture(GL_TEXTURE_2D, textures[0]);1367glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);13681369glBindTexture(GL_TEXTURE_2D, textures[1]);1370glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGBA,1371GL_UNSIGNED_SHORT_5_5_5_1, GL_FALSE, GL_FALSE, GL_FALSE);13721373GLFramebuffer fbo;1374glBindFramebuffer(GL_FRAMEBUFFER, fbo);1375glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);13761377EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 0), 1.0);1378EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(16, 16, 16, 0), 1.0);1379EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(33, 33, 33, 0), 1.0);1380EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(49, 49, 49, 255), 1.0);13811382testGradientDownsampleUniqueValues(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, {32, 32, 32, 2});1383}13841385// Test to ensure that CopyTexture works with LUMINANCE texture as a destination1386TEST_P(CopyTextureTestDest, Luminance)1387{1388if (!checkExtensions())1389{1390return;1391}13921393GLColor originalPixels(50u, 100u, 150u, 200u);1394GLColor expectedPixels(50u, 50u, 50u, 255u);13951396// ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA1397// texture to verify contents.1398glBindTexture(GL_TEXTURE_2D, mTextures[1]);1399glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1400glBindTexture(GL_TEXTURE_2D, mTextures[0]);1401glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);14021403glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,1404GL_UNSIGNED_BYTE, false, false, false);14051406EXPECT_GL_NO_ERROR();14071408glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1409GL_UNSIGNED_BYTE, false, false, false);14101411EXPECT_GL_NO_ERROR();14121413EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1414}14151416// Test to ensure that CopyTexture works with LUMINANCE texture as a destination with1417// UnpackPremultiply parameter1418TEST_P(CopyTextureTestDest, LuminanceMultiply)1419{1420if (!checkExtensions())1421{1422return;1423}14241425GLColor originalPixels(50u, 100u, 150u, 200u);1426GLColor expectedPixels(39u, 39u, 39u, 255u);14271428// ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA1429// texture to verify contents.1430glBindTexture(GL_TEXTURE_2D, mTextures[1]);1431glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1432glBindTexture(GL_TEXTURE_2D, mTextures[0]);1433glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);14341435glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,1436GL_UNSIGNED_BYTE, false, true, false);14371438EXPECT_GL_NO_ERROR();14391440glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1441GL_UNSIGNED_BYTE, false, false, false);14421443EXPECT_GL_NO_ERROR();14441445EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1446}14471448// Test to ensure that CopyTexture works with LUMINANCE texture as a destination with1449// UnpackUnmultiply parameter1450TEST_P(CopyTextureTestDest, LuminanceUnmultiply)1451{1452if (!checkExtensions())1453{1454return;1455}14561457GLColor originalPixels(50u, 100u, 150u, 200u);1458GLColor expectedPixels(64u, 64u, 64u, 255u);14591460// ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA1461// texture to verify contents.1462glBindTexture(GL_TEXTURE_2D, mTextures[1]);1463glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1464glBindTexture(GL_TEXTURE_2D, mTextures[0]);1465glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);14661467glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,1468GL_UNSIGNED_BYTE, false, false, true);14691470EXPECT_GL_NO_ERROR();14711472glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1473GL_UNSIGNED_BYTE, false, false, false);14741475EXPECT_GL_NO_ERROR();14761477EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1478}14791480// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination1481TEST_P(CopyTextureTestDest, LuminanceAlpha)1482{1483if (!checkExtensions())1484{1485return;1486}14871488GLColor originalPixels(50u, 100u, 150u, 200u);1489GLColor expectedPixels(50u, 50u, 50u, 200u);14901491// ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an1492// RGBA texture to verify contents.1493glBindTexture(GL_TEXTURE_2D, mTextures[1]);1494glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1495glBindTexture(GL_TEXTURE_2D, mTextures[0]);1496glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,1497GL_UNSIGNED_BYTE, nullptr);14981499glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,1500GL_UNSIGNED_BYTE, false, false, false);15011502EXPECT_GL_NO_ERROR();15031504glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1505GL_UNSIGNED_BYTE, false, false, false);15061507EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1508}15091510// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with1511// UnpackPremultiply parameter1512TEST_P(CopyTextureTestDest, LuminanceAlphaMultiply)1513{1514if (!checkExtensions())1515{1516return;1517}15181519GLColor originalPixels(50u, 100u, 150u, 200u);1520GLColor expectedPixels(39u, 39u, 39u, 200u);15211522// ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an1523// RGBA texture to verify contents.1524glBindTexture(GL_TEXTURE_2D, mTextures[1]);1525glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1526glBindTexture(GL_TEXTURE_2D, mTextures[0]);1527glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,1528GL_UNSIGNED_BYTE, nullptr);15291530glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,1531GL_UNSIGNED_BYTE, false, true, false);15321533EXPECT_GL_NO_ERROR();15341535glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1536GL_UNSIGNED_BYTE, false, false, false);15371538EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1539}15401541// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with1542// UnpackUnmultiplyAlpha parameter1543TEST_P(CopyTextureTestDest, LuminanceAlphaUnmultiply)1544{1545if (!checkExtensions())1546{1547return;1548}15491550GLColor originalPixels(50u, 100u, 150u, 200u);1551GLColor expectedPixels(64u, 64u, 64u, 200u);15521553// ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an1554// RGBA texture to verify contents.1555glBindTexture(GL_TEXTURE_2D, mTextures[1]);1556glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1557glBindTexture(GL_TEXTURE_2D, mTextures[0]);1558glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,1559GL_UNSIGNED_BYTE, nullptr);15601561glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,1562GL_UNSIGNED_BYTE, false, false, true);15631564EXPECT_GL_NO_ERROR();15651566glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1567GL_UNSIGNED_BYTE, false, false, false);15681569EXPECT_GL_NO_ERROR();15701571EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1572}15731574// Test to ensure that CopyTexture works with ALPHA texture as a destination1575TEST_P(CopyTextureTestDest, Alpha)1576{1577if (!checkExtensions())1578{1579return;1580}15811582GLColor originalPixels(50u, 100u, 150u, 155u);1583GLColor expectedPixels(0u, 0u, 0u, 155u);15841585// ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA1586// texture to verify contents.1587glBindTexture(GL_TEXTURE_2D, mTextures[1]);1588glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1589glBindTexture(GL_TEXTURE_2D, mTextures[0]);1590glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);15911592glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,1593GL_UNSIGNED_BYTE, false, false, false);15941595EXPECT_GL_NO_ERROR();15961597glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1598GL_UNSIGNED_BYTE, false, false, false);15991600EXPECT_GL_NO_ERROR();16011602EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1603}16041605// Test to ensure that CopyTexture works with ALPHA texture as a destination with1606// UnpackPremultiplyAlpha parameter1607TEST_P(CopyTextureTestDest, AlphaMultiply)1608{1609if (!checkExtensions())1610{1611return;1612}16131614GLColor originalPixels(50u, 100u, 150u, 155u);1615GLColor expectedPixels(0u, 0u, 0u, 155u);16161617// ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA1618// texture to verify contents.1619glBindTexture(GL_TEXTURE_2D, mTextures[1]);1620glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1621glBindTexture(GL_TEXTURE_2D, mTextures[0]);1622glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);16231624glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,1625GL_UNSIGNED_BYTE, false, true, false);16261627EXPECT_GL_NO_ERROR();16281629glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1630GL_UNSIGNED_BYTE, false, false, false);16311632EXPECT_GL_NO_ERROR();16331634EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1635}16361637// Test to ensure that CopyTexture works with ALPHA texture as a destination with1638// UnpackUnmultiplyAlpha parameter1639TEST_P(CopyTextureTestDest, AlphaUnmultiply)1640{1641if (!checkExtensions())1642{1643return;1644}16451646GLColor originalPixels(50u, 100u, 150u, 155u);1647GLColor expectedPixels(0u, 0u, 0u, 155u);16481649// ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA1650// texture to verify contents.1651glBindTexture(GL_TEXTURE_2D, mTextures[1]);1652glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1653glBindTexture(GL_TEXTURE_2D, mTextures[0]);1654glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);16551656glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,1657GL_UNSIGNED_BYTE, false, false, true);16581659EXPECT_GL_NO_ERROR();16601661glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1662GL_UNSIGNED_BYTE, false, false, false);16631664EXPECT_GL_NO_ERROR();16651666EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1667}16681669// Test to ensure that CopyTexture uses the correct ALPHA passthrough shader to ensure RGB channels1670// are set to 0.1671TEST_P(CopyTextureTestDest, AlphaCopyWithRGB)1672{1673// http://anglebug.com/41211674ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGLES());1675ANGLE_SKIP_TEST_IF(!checkExtensions());1676ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));16771678GLColor originalPixels(50u, 100u, 150u, 155u);1679GLColor expectedPixels(0u, 0u, 0u, 155u);16801681// ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA1682// texture to verify contents.1683glBindTexture(GL_TEXTURE_2D, mTextures[1]);1684glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);1685glBindTexture(GL_TEXTURE_2D, mTextures[0]);1686glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_HALF_FLOAT_OES, nullptr);16871688glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,1689GL_HALF_FLOAT_OES, false, false, false);16901691EXPECT_GL_NO_ERROR();16921693glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1694GL_UNSIGNED_BYTE, false, false, false);16951696EXPECT_GL_NO_ERROR();16971698EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);1699}17001701// Bug where TEXTURE_SWIZZLE_RGBA was not reset after the Luminance workaround. (crbug.com/1022080)1702TEST_P(CopyTextureTestES3, LuminanceWorkaroundTextureSwizzleBug)1703{1704ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_sRGB"));17051706{1707GLColor pixels(50u, 20u, 100u, 150u);17081709// Hit BlitGL::copySubImageToLUMAWorkaroundTexture by copying an ALPHA texture1710GLTexture srcTexture;1711glBindTexture(GL_TEXTURE_2D, srcTexture);1712glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);17131714GLFramebuffer srcFBO;1715glBindFramebuffer(GL_FRAMEBUFFER, srcFBO);1716glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture, 0);17171718GLTexture dstTexture;1719glBindTexture(GL_TEXTURE_2D, dstTexture);1720glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);17211722glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);1723EXPECT_GL_NO_ERROR();1724}17251726{1727// This time hit BlitGL::blitColorBufferWithShader by copying an SRGB texture1728GLColor pixels(100u, 200u, 50u, 210u);17291730GLTexture srcTexture;1731glBindTexture(GL_TEXTURE_2D, srcTexture);1732glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT,1733GL_UNSIGNED_BYTE, &pixels);17341735GLFramebuffer srcFBO;1736glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);1737glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture,17380);17391740GLTexture dstTexture;1741glBindTexture(GL_TEXTURE_2D, dstTexture);1742glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT,1743GL_UNSIGNED_BYTE, nullptr);17441745GLFramebuffer dstFBO;1746glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFBO);1747glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstTexture,17480);17491750glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);17511752// The previous workaround should not affect this copy1753glBindFramebuffer(GL_FRAMEBUFFER, dstFBO);1754EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);1755}1756}17571758// Test to ensure that CopyTexture will fail with a non-zero level and NPOT texture in WebGL1759TEST_P(CopyTextureTestWebGL, NPOT)1760{1761if (IsGLExtensionRequestable("GL_CHROMIUM_copy_texture"))1762{1763glRequestExtensionANGLE("GL_CHROMIUM_copy_texture");1764}1765ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_CHROMIUM_copy_texture"));17661767std::vector<GLColor> pixelData(10 * 10, GLColor::red);17681769glBindTexture(GL_TEXTURE_2D, mTextures[0]);1770glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());17711772// Do a basic copy to make sure things work1773glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,1774GL_UNSIGNED_BYTE, false, false, false);17751776EXPECT_GL_NO_ERROR();17771778EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);17791780// Do the same operation with destLevel 1, which should fail1781glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 1, GL_RGBA,1782GL_UNSIGNED_BYTE, false, false, false);17831784EXPECT_GL_ERROR(GL_INVALID_VALUE);1785}17861787// Test the newly added ES3 unorm formats1788TEST_P(CopyTextureTestES3, ES3UnormFormats)1789{1790if (!checkExtensions())1791{1792return;1793}1794// http://anglebug.com/40921795ANGLE_SKIP_TEST_IF(IsAndroid());17961797// http://anglebug.com/51271798ANGLE_SKIP_TEST_IF(IsWindows() && IsOpenGL() && IsIntel());17991800auto testOutput = [this](GLuint texture, const GLColor &expectedColor) {1801constexpr char kVS[] =1802"#version 300 es\n"1803"in vec4 position;\n"1804"out vec2 texcoord;\n"1805"void main()\n"1806"{\n"1807" gl_Position = vec4(position.xy, 0.0, 1.0);\n"1808" texcoord = (position.xy * 0.5) + 0.5;\n"1809"}\n";18101811constexpr char kFS[] =1812"#version 300 es\n"1813"precision mediump float;\n"1814"uniform sampler2D tex;\n"1815"in vec2 texcoord;\n"1816"out vec4 color;\n"1817"void main()\n"1818"{\n"1819" color = texture(tex, texcoord);\n"1820"}\n";18211822ANGLE_GL_PROGRAM(program, kVS, kFS);1823glUseProgram(program);18241825GLRenderbuffer rbo;1826glBindRenderbuffer(GL_RENDERBUFFER, rbo);1827glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);18281829GLFramebuffer fbo;1830glBindFramebuffer(GL_FRAMEBUFFER, fbo);1831glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);18321833glActiveTexture(GL_TEXTURE0);1834glBindTexture(GL_TEXTURE_2D, texture);1835glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1836glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1837glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);18381839drawQuad(program, "position", 0.5f, 1.0f, true);18401841EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, 1.0);1842};18431844auto testCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,1845GLenum sourceType, const GLColor &sourceColor,1846GLenum destInternalFormat, GLenum destType, bool flipY,1847bool premultiplyAlpha, bool unmultiplyAlpha,1848const GLColor &expectedColor) {1849GLTexture sourceTexture;1850glBindTexture(GL_TEXTURE_2D, sourceTexture);1851glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,1852&sourceColor);18531854GLTexture destTexture;1855glBindTexture(GL_TEXTURE_2D, destTexture);18561857glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,1858destType, flipY, premultiplyAlpha, unmultiplyAlpha);1859ASSERT_GL_NO_ERROR();18601861testOutput(destTexture, expectedColor);1862};18631864auto testSubCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,1865GLenum sourceType, const GLColor &sourceColor,1866GLenum destInternalFormat, GLenum destFormat,1867GLenum destType, bool flipY, bool premultiplyAlpha,1868bool unmultiplyAlpha, const GLColor &expectedColor) {1869GLTexture sourceTexture;1870glBindTexture(GL_TEXTURE_2D, sourceTexture);1871glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,1872&sourceColor);18731874GLTexture destTexture;1875glBindTexture(GL_TEXTURE_2D, destTexture);18761877glTexImage2D(GL_TEXTURE_2D, 0, destInternalFormat, 1, 1, 0, destFormat, destType, nullptr);1878glCopySubTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 0, 0, 1, 1,1879flipY, premultiplyAlpha, unmultiplyAlpha);1880ASSERT_GL_NO_ERROR();18811882testOutput(destTexture, expectedColor);1883};18841885// New LUMA source formats1886testCopyCombination(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGB,1887GL_UNSIGNED_BYTE, false, false, false, GLColor(128, 128, 128, 255));1888testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,1889GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, false,1890GLColor(128, 128, 128, 255));1891testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,1892GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, true, false,1893GLColor(32, 32, 32, 255));1894testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,1895GLColor(128, 128, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, true,1896GLColor(255, 255, 255, 255));1897testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,1898GL_UNSIGNED_BYTE, false, false, false, GLColor(0, 0, 0, 128));1899testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,1900GL_UNSIGNED_BYTE, false, false, true, GLColor(0, 0, 0, 128));1901testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,1902GL_UNSIGNED_BYTE, false, true, false, GLColor(0, 0, 0, 128));19031904// New sRGB dest formats1905if (IsGLExtensionEnabled("GL_EXT_sRGB"))1906{1907testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,1908GL_UNSIGNED_BYTE, false, false, false, GLColor(55, 13, 4, 255));1909testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,1910GL_UNSIGNED_BYTE, false, true, false, GLColor(13, 4, 1, 255));1911testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),1912GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false, false,1913GLColor(55, 13, 4, 128));19141915testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),1916GL_SRGB, GL_SRGB, GL_UNSIGNED_BYTE, false, false, false,1917GLColor(55, 13, 4, 255));1918testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),1919GL_SRGB, GL_SRGB, GL_UNSIGNED_BYTE, false, true, false,1920GLColor(13, 4, 1, 255));1921testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),1922GL_SRGB_ALPHA_EXT, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false,1923false, GLColor(55, 13, 4, 128));1924}1925}19261927// Test the newly added ES3 float formats1928TEST_P(CopyTextureTestES3, ES3FloatFormats)1929{1930if (!checkExtensions())1931{1932return;1933}19341935ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));19361937auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {1938constexpr char kVS[] =1939"#version 300 es\n"1940"in vec4 position;\n"1941"out vec2 texcoord;\n"1942"void main()\n"1943"{\n"1944" gl_Position = vec4(position.xy, 0.0, 1.0);\n"1945" texcoord = (position.xy * 0.5) + 0.5;\n"1946"}\n";19471948constexpr char kFS[] =1949"#version 300 es\n"1950"precision mediump float;\n"1951"uniform sampler2D tex;\n"1952"in vec2 texcoord;\n"1953"out vec4 color;\n"1954"void main()\n"1955"{\n"1956" color = texture(tex, texcoord);\n"1957"}\n";19581959ANGLE_GL_PROGRAM(program, kVS, kFS);1960glUseProgram(program);19611962GLRenderbuffer rbo;1963glBindRenderbuffer(GL_RENDERBUFFER, rbo);1964glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);19651966GLFramebuffer fbo;1967glBindFramebuffer(GL_FRAMEBUFFER, fbo);1968glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);19691970glActiveTexture(GL_TEXTURE0);1971glBindTexture(GL_TEXTURE_2D, texture);1972glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1973glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1974glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);19751976drawQuad(program, "position", 0.5f, 1.0f, true);19771978EXPECT_PIXEL_COLOR32F_NEAR(0, 0, expectedColor, 0.05);1979};19801981auto testCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,1982GLenum sourceType, const GLColor &sourceColor,1983GLenum destInternalFormat, GLenum destType, bool flipY,1984bool premultiplyAlpha, bool unmultiplyAlpha,1985const GLColor32F &expectedColor) {1986GLTexture sourceTexture;1987glBindTexture(GL_TEXTURE_2D, sourceTexture);1988glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,1989&sourceColor);19901991GLTexture destTexture;1992glBindTexture(GL_TEXTURE_2D, destTexture);19931994glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,1995destType, flipY, premultiplyAlpha, unmultiplyAlpha);1996ASSERT_GL_NO_ERROR();19971998testOutput(destTexture, expectedColor);1999};20002001testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,2002GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 0.5f));2003testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,2004GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 0.5f));2005testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,2006GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 0.5f));20072008testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,2009GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.0f, 0.0f, 1.0f));2010testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,2011GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.0f, 0.0f, 1.0f));2012testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,2013GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.0f, 0.0f, 1.0f));20142015testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,2016GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.0f, 1.0f));2017testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,2018GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0f, 1.0f));2019testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,2020GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.0f, 1.0f));20212022testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,2023GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));2024testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,2025GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));2026testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,2027GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));20282029testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),2030GL_R11F_G11F_B10F, GL_FLOAT, false, false, false,2031GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));2032testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),2033GL_R11F_G11F_B10F, GL_FLOAT, false, true, false,2034GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));2035testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),2036GL_R11F_G11F_B10F, GL_FLOAT, false, false, true,2037GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));20382039testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,2040GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));2041testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,2042GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));2043testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,2044GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));2045}20462047// Test the newly added ES3 unsigned integer formats2048TEST_P(CopyTextureTestES3, ES3UintFormats)2049{2050ANGLE_SKIP_TEST_IF(IsLinux() && IsOpenGL() && IsIntel());20512052if (!checkExtensions())2053{2054return;2055}20562057using GLColor32U = std::tuple<GLuint, GLuint, GLuint, GLuint>;20582059auto testOutput = [this](GLuint texture, const GLColor32U &expectedColor) {2060constexpr char kVS[] =2061"#version 300 es\n"2062"in vec4 position;\n"2063"out vec2 texcoord;\n"2064"void main()\n"2065"{\n"2066" gl_Position = vec4(position.xy, 0.0, 1.0);\n"2067" texcoord = (position.xy * 0.5) + 0.5;\n"2068"}\n";20692070constexpr char kFS[] =2071"#version 300 es\n"2072"precision mediump float;\n"2073"precision mediump usampler2D;\n"2074"in vec2 texcoord;\n"2075"uniform usampler2D tex;\n"2076"out uvec4 color;\n"2077"void main()\n"2078"{\n"2079" color = texture(tex, texcoord);\n"2080"}\n";20812082ANGLE_GL_PROGRAM(program, kVS, kFS);2083glUseProgram(program);20842085GLRenderbuffer rbo;2086glBindRenderbuffer(GL_RENDERBUFFER, rbo);2087glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8UI, 1, 1);20882089GLFramebuffer fbo;2090glBindFramebuffer(GL_FRAMEBUFFER, fbo);2091glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);20922093glActiveTexture(GL_TEXTURE0);2094glBindTexture(GL_TEXTURE_2D, texture);2095glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);2096glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);2097glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);20982099drawQuad(program, "position", 0.5f, 1.0f, true);2100ASSERT_GL_NO_ERROR();21012102GLuint pixel[4] = {0};2103glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);2104ASSERT_GL_NO_ERROR();2105EXPECT_NEAR(std::get<0>(expectedColor), pixel[0], 1);2106EXPECT_NEAR(std::get<1>(expectedColor), pixel[1], 1);2107EXPECT_NEAR(std::get<2>(expectedColor), pixel[2], 1);2108EXPECT_NEAR(std::get<3>(expectedColor), pixel[3], 1);2109};21102111auto testCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,2112GLenum sourceType, const GLColor &sourceColor,2113GLenum destInternalFormat, GLenum destType, bool flipY,2114bool premultiplyAlpha, bool unmultiplyAlpha,2115const GLColor32U &expectedColor) {2116GLTexture sourceTexture;2117glBindTexture(GL_TEXTURE_2D, sourceTexture);2118glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,2119&sourceColor);21202121GLTexture destTexture;2122glBindTexture(GL_TEXTURE_2D, destTexture);21232124glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,2125destType, flipY, premultiplyAlpha, unmultiplyAlpha);2126ASSERT_GL_NO_ERROR();21272128testOutput(destTexture, expectedColor);2129};21302131testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,2132GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 128));2133testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,2134GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 128));2135testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,2136GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 128));21372138testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,2139GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 1));2140testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,2141GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 1));2142testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,2143GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 1));21442145testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,2146GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 0, 1));2147testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,2148GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 0, 1));2149testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,2150GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 0, 1));21512152testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,2153GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 0, 0, 1));2154testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,2155GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 0, 0, 1));2156testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(120, 64, 32, 128), GL_R8UI,2157GL_UNSIGNED_BYTE, false, false, true, GLColor32U(240, 0, 0, 1));2158}21592160// Test that using an offset in CopySubTexture works correctly for non-renderable float targets2161TEST_P(CopyTextureTestES3, CopySubTextureOffsetNonRenderableFloat)2162{2163if (!checkExtensions())2164{2165return;2166}21672168ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));21692170auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {2171constexpr char kVS[] =2172"#version 300 es\n"2173"in vec4 position;\n"2174"out vec2 texcoord;\n"2175"void main()\n"2176"{\n"2177" gl_Position = vec4(position.xy, 0.0, 1.0);\n"2178" texcoord = (position.xy * 0.5) + 0.5;\n"2179"}\n";21802181constexpr char kFS[] =2182"#version 300 es\n"2183"precision mediump float;\n"2184"uniform sampler2D tex;\n"2185"in vec2 texcoord;\n"2186"out vec4 color;\n"2187"void main()\n"2188"{\n"2189" color = texture(tex, texcoord);\n"2190"}\n";21912192ANGLE_GL_PROGRAM(program, kVS, kFS);2193glUseProgram(program);21942195GLRenderbuffer rbo;2196glBindRenderbuffer(GL_RENDERBUFFER, rbo);2197glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);21982199GLFramebuffer fbo;2200glBindFramebuffer(GL_FRAMEBUFFER, fbo);2201glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);22022203glActiveTexture(GL_TEXTURE0);2204glBindTexture(GL_TEXTURE_2D, texture);2205glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);2206glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);2207glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);22082209drawQuad(program, "position", 0.5f, 1.0f, true);22102211EXPECT_PIXEL_COLOR32F_NEAR(0, 0, expectedColor, 0.05);2212};22132214auto testCopy = [this, testOutput](GLenum destInternalFormat, GLenum destFormat,2215GLenum destType) {2216GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};2217glBindTexture(GL_TEXTURE_2D, mTextures[0]);2218glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);22192220GLTexture destTexture;2221glBindTexture(GL_TEXTURE_2D, destTexture);2222glTexImage2D(GL_TEXTURE_2D, 0, destInternalFormat, 1, 1, 0, destFormat, destType, nullptr);22232224glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 0, 0, 1, 1,2225false, false, false);2226EXPECT_GL_NO_ERROR();2227testOutput(destTexture, kFloatRed);22282229glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 1, 0, 1, 1,2230false, false, false);2231EXPECT_GL_NO_ERROR();2232testOutput(destTexture, kFloatGreen);22332234glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 0, 1, 1, 1,2235false, false, false);2236EXPECT_GL_NO_ERROR();2237testOutput(destTexture, kFloatBlue);22382239glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 1, 1, 1, 1,2240false, false, false);2241EXPECT_GL_NO_ERROR();2242testOutput(destTexture, kFloatBlack);2243};22442245testCopy(GL_RGB9_E5, GL_RGB, GL_FLOAT);2246}22472248// Test that copying from one mip to another works2249TEST_P(CopyTextureTestES3, CopyBetweenMips)2250{2251if (!checkExtensions())2252{2253return;2254}22552256glBindFramebuffer(GL_FRAMEBUFFER, 0);22572258ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());2259glUseProgram(program);2260GLint textureLoc = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());2261GLint lodLoc = glGetUniformLocation(program, essl3_shaders::LodUniform());2262ASSERT_NE(-1, textureLoc);2263ASSERT_NE(-1, lodLoc);2264glUniform1i(textureLoc, 0);2265glUniform1f(lodLoc, 0);22662267GLTexture texture;22682269// Create a texture with 3 mips. Mip0 will contain an image as follows:2270//2271// G G B G2272// G R R G2273// G R R G2274// G G G G2275//2276// The 2x2 red square and 1x1 blue square will be copied to the other mips.2277const GLColor kMip0InitColor[4 * 4] = {2278GLColor::green, GLColor::green, GLColor::blue, GLColor::green,2279GLColor::green, GLColor::red, GLColor::red, GLColor::green,2280GLColor::green, GLColor::red, GLColor::red, GLColor::green,2281GLColor::green, GLColor::green, GLColor::green, GLColor::green,2282};2283const GLColor kMipOtherInitColor[4] = {2284GLColor::black,2285GLColor::black,2286GLColor::black,2287GLColor::black,2288};22892290glActiveTexture(GL_TEXTURE0);2291glBindTexture(GL_TEXTURE_2D, texture);2292glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, kMip0InitColor);2293glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, kMipOtherInitColor);2294glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, kMipOtherInitColor);2295glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);2296glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);2297ASSERT_GL_NO_ERROR();22982299// Commit texture2300glUniform1f(lodLoc, 0);2301drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);2302EXPECT_PIXEL_COLOR_EQ(0, 0, kMip0InitColor[0]);23032304glUniform1f(lodLoc, 1);2305drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);2306EXPECT_PIXEL_COLOR_EQ(0, 0, kMipOtherInitColor[0]);23072308glUniform1f(lodLoc, 2);2309drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);2310EXPECT_PIXEL_COLOR_EQ(0, 0, kMipOtherInitColor[0]);23112312ASSERT_GL_NO_ERROR();23132314// Copy from mip 0 to mip 1. The level is not redefined, so a direct copy can potentially be2315// done.2316glCopySubTextureCHROMIUM(texture, 0, GL_TEXTURE_2D, texture, 1, 0, 0, 1, 1, 2, 2, false, false,2317false);2318EXPECT_GL_NO_ERROR();23192320// Copy from mip 0 to mip 2. Again, the level is not redefined.2321glCopySubTextureCHROMIUM(texture, 0, GL_TEXTURE_2D, texture, 2, 0, 0, 2, 0, 1, 1, false, false,2322false);2323EXPECT_GL_NO_ERROR();23242325// Verify mips 1 and 2.2326int w = getWindowWidth() - 1;2327int h = getWindowHeight() - 1;23282329glUniform1f(lodLoc, 1);2330drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);2331EXPECT_PIXEL_COLOR_EQ(0, 0, kMip0InitColor[4 * 1 + 1]);2332EXPECT_PIXEL_COLOR_EQ(w, 0, kMip0InitColor[4 * 1 + 2]);2333EXPECT_PIXEL_COLOR_EQ(0, h, kMip0InitColor[4 * 2 + 1]);2334EXPECT_PIXEL_COLOR_EQ(w, h, kMip0InitColor[4 * 2 + 2]);23352336glUniform1f(lodLoc, 2);2337drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);2338EXPECT_PIXEL_COLOR_EQ(0, 0, kMip0InitColor[4 * 0 + 2]);2339EXPECT_PIXEL_COLOR_EQ(w, 0, kMip0InitColor[4 * 0 + 2]);2340EXPECT_PIXEL_COLOR_EQ(0, h, kMip0InitColor[4 * 0 + 2]);2341EXPECT_PIXEL_COLOR_EQ(w, h, kMip0InitColor[4 * 0 + 2]);2342}23432344// Test that swizzle on source texture does not affect the copy.2345TEST_P(CopyTextureTestES3, SwizzleOnSource)2346{2347const GLColor kSourceColor = GLColor(31, 73, 146, 228);23482349// Create image with swizzle. If swizzle is mistakenly applied, resulting color would be2350// kSourceColor.gbar2351GLTexture sourceTexture;2352glBindTexture(GL_TEXTURE_2D, sourceTexture);2353glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kSourceColor);2354glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_GREEN);2355glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_BLUE);2356glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ALPHA);2357glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED);23582359GLTexture destTexture;2360glBindTexture(GL_TEXTURE_2D, destTexture);23612362// Note: flipY is used to avoid direct transfer between textures and force a draw-based path.2363glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, GL_RGBA8,2364GL_UNSIGNED_BYTE, true, false, false);2365ASSERT_GL_NO_ERROR();23662367// Verify the copy.2368ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());2369glUseProgram(program);23702371glActiveTexture(GL_TEXTURE0);2372glBindTexture(GL_TEXTURE_2D, destTexture);2373glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);2374glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);23752376GLint textureLocation = glGetUniformLocation(program, essl1_shaders::Texture2DUniform());2377ASSERT_NE(-1, textureLocation);2378glUniform1i(textureLocation, 0);23792380glBindFramebuffer(GL_FRAMEBUFFER, 0);23812382drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);2383ASSERT_GL_NO_ERROR();23842385EXPECT_PIXEL_COLOR_EQ(0, 0, kSourceColor);2386}23872388// Test that copy after invalidate works2389TEST_P(CopyTextureTestES3, InvalidateCopyThenBlend)2390{2391ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());23922393// http://anglebug.com/51552394ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel() && IsOpenGL());23952396// http://anglebug.com/51562397ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsOpenGL());23982399constexpr GLsizei kSize = 4;24002401GLTexture texture;2402glBindTexture(GL_TEXTURE_2D, texture);2403glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize * 2, kSize * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,2404nullptr);2405glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize * 2, kSize * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,2406nullptr);2407glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);2408glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kSize / 2, kSize / 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,2409nullptr);2410glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA8, kSize / 4, kSize / 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,2411nullptr);2412glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);2413glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);24142415GLFramebuffer framebuffer;2416glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);2417glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 2);2418EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);24192420// Invalidate the framebuffer.2421const GLenum discards[] = {GL_COLOR_ATTACHMENT0};2422glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);2423ASSERT_GL_NO_ERROR();24242425// Copy into the framebuffer attachment.2426const std::vector<GLColor> kSourceColor(kSize * kSize, GLColor::green);2427GLTexture sourceTexture;2428glBindTexture(GL_TEXTURE_2D, sourceTexture);2429glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,2430kSourceColor.data());2431// Note: flipY is used to avoid direct transfer between textures and force a draw-based path.2432glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, texture, 2, GL_RGBA8, GL_UNSIGNED_BYTE,2433true, false, false);2434ASSERT_GL_NO_ERROR();24352436// Draw and blend, making sure both the copy and draw happen correctly.2437glEnable(GL_BLEND);2438glBlendFunc(GL_ONE, GL_ONE);2439drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);2440ASSERT_GL_NO_ERROR();24412442// Make sure the blend was correctly done.2443EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);2444EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::yellow);2445EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::yellow);2446EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::yellow);2447}24482449void CopyTextureTestES3::invalidateBlitThenBlendCommon(GLsizei layerCount)2450{2451// http://anglebug.com/51522452ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGL());24532454// http://anglebug.com/51552455ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel() && IsOpenGL());24562457// http://anglebug.com/51562458ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsOpenGL());24592460ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());24612462constexpr GLsizei kSize = 4;24632464GLTexture texture;2465glBindTexture(GL_TEXTURE_2D_ARRAY, texture);2466glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, kSize * 2, kSize * 2, layerCount, 0, GL_RGBA,2467GL_UNSIGNED_BYTE, nullptr);2468glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, kSize * 2, kSize * 2, layerCount, 0, GL_RGBA,2469GL_UNSIGNED_BYTE, nullptr);2470glTexImage3D(GL_TEXTURE_2D_ARRAY, 2, GL_RGBA8, kSize, kSize, layerCount, 0, GL_RGBA,2471GL_UNSIGNED_BYTE, nullptr);2472glTexImage3D(GL_TEXTURE_2D_ARRAY, 3, GL_RGBA8, kSize / 2, kSize / 2, layerCount, 0, GL_RGBA,2473GL_UNSIGNED_BYTE, nullptr);2474glTexImage3D(GL_TEXTURE_2D_ARRAY, 4, GL_RGBA8, kSize / 4, kSize / 4, layerCount, 0, GL_RGBA,2475GL_UNSIGNED_BYTE, nullptr);2476glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);2477glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 4);24782479GLFramebuffer framebuffer;2480glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);2481glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 2, layerCount / 2);2482EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);24832484// Invalidate the framebuffer.2485const GLenum discards[] = {GL_COLOR_ATTACHMENT0};2486glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);2487ASSERT_GL_NO_ERROR();24882489// Blit into the framebuffer attachment.2490const std::vector<GLColor> kSourceColor(kSize * kSize, GLColor::green);2491GLTexture sourceTexture;2492glBindTexture(GL_TEXTURE_2D, sourceTexture);2493glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,2494kSourceColor.data());2495GLFramebuffer sourceFramebuffer;2496glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebuffer);2497glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTexture,24980);2499EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);25002501glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);2502ASSERT_GL_NO_ERROR();25032504// Draw and blend, making sure both the blit and draw happen correctly.2505glEnable(GL_BLEND);2506glBlendFunc(GL_ONE, GL_ONE);2507drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);2508ASSERT_GL_NO_ERROR();25092510// Make sure the blend was correctly done.2511glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);2512EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);2513EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::yellow);2514EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::yellow);2515EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::yellow);2516}25172518// Test that blit after invalidate works with non-zero layer2519TEST_P(CopyTextureTestES3, InvalidateBlitThenBlend3Layers)2520{2521invalidateBlitThenBlendCommon(3);2522}25232524// Test that blit after invalidate works with non-zero layer that is very large2525TEST_P(CopyTextureTestES3, InvalidateBlitThenBlend1000Layers)2526{2527invalidateBlitThenBlendCommon(1000);2528}25292530#ifdef Bool2531// X11 craziness.2532# undef Bool2533#endif25342535ANGLE_INSTANTIATE_TEST_ES2(CopyTextureTest);2536ANGLE_INSTANTIATE_TEST_COMBINE_5(CopyTextureVariationsTest,2537CopyTextureVariationsTestPrint,2538testing::ValuesIn(kCopyTextureVariationsSrcFormats),2539testing::ValuesIn(kCopyTextureVariationsDstFormats),2540testing::Bool(), // flipY2541testing::Bool(), // premultiplyAlpha2542testing::Bool(), // unmultiplyAlpha2543ES2_D3D9(),2544ES2_D3D11(),2545ES2_OPENGL(),2546ES2_OPENGLES(),2547ES2_VULKAN(),2548ES2_METAL());2549ANGLE_INSTANTIATE_TEST_ES2(CopyTextureTestWebGL);2550ANGLE_INSTANTIATE_TEST(CopyTextureTestDest,2551ES2_D3D11(),2552ES2_OPENGL(),2553ES2_OPENGLES(),2554ES2_VULKAN(),2555ES2_METAL());25562557GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CopyTextureTestES3);2558ANGLE_INSTANTIATE_TEST_ES3(CopyTextureTestES3);25592560} // namespace angle256125622563