Revert "Vulkan: Accelerate Texture PBO updates"
This reverts commit efb45edaefc07fc7120ebbde83bbc84876afda1a.
Reason for revert: Significant perf regression on several benchmarks.
See bug for more details.
Bug: chromium:1027098
Original change's description:
> Vulkan: Accelerate Texture PBO updates
>
> If the format of the image and the PBO match,
> use a vkCmdCopyBufferToImage transfer operation.
>
> Test: angle_end2end_tests --gtest_filter=*PBOCompressedSubImage*
> angle_end2end_tests --gtest_filter=*PBOWithMultipleDraws*
> dEQP-GLES3.functional.texture.specification.tex*image*d_pbo*
> Bug: angleproject:3777
> Change-Id: I3f271024a635be113202a16f8893a199c194172d
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1906203
> Reviewed-by: Cody Northrop <cnorthrop@google.com>
> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
TBR=cnorthrop@google.com,syoussefi@chromium.org,jmadill@chromium.org,m.maiya@samsung.com,b.schade@samsung.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: angleproject:3777
Change-Id: I774655962e9ab5a866b9324002fb8edae8550834
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1939927
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp
index d3f105f..9193a52 100644
--- a/src/tests/gl_tests/TextureTest.cpp
+++ b/src/tests/gl_tests/TextureTest.cpp
@@ -16,9 +16,6 @@
constexpr GLuint kPixelTolerance = 1u;
constexpr GLfloat kPixelTolerance32F = 0.01f;
-// Single compressed ETC2 block of source pixels all set red
-constexpr uint8_t kCompressedImageETC2[] = {0x7E, 0x80, 0x04, 0x7F, 0x00, 0x07, 0xE0, 0x00};
-
// Take a pixel, and reset the components not covered by the format to default
// values. In particular, the default value for the alpha component is 255
// (1.0 as unsigned normalized fixed point value).
@@ -1422,32 +1419,6 @@
}
};
-class PBOCompressedTextureTest : public Texture2DTest
-{
- protected:
- PBOCompressedTextureTest() : Texture2DTest() {}
-
- void testSetUp() override
- {
- TexCoordDrawTest::testSetUp();
- glGenTextures(1, &mTexture2D);
- glBindTexture(GL_TEXTURE_2D, mTexture2D);
- EXPECT_GL_NO_ERROR();
-
- setUpProgram();
-
- glGenBuffers(1, &mPBO);
- }
-
- void testTearDown() override
- {
- glDeleteBuffers(1, &mPBO);
- Texture2DTest::testTearDown();
- }
-
- GLuint mPBO;
-};
-
TEST_P(Texture2DTest, NegativeAPISubImage)
{
glBindTexture(GL_TEXTURE_2D, mTexture2D);
@@ -1792,176 +1763,53 @@
// initialized the image with a default color.
TEST_P(Texture2DTest, TexStorageWithPBO)
{
- // http://anglebug.com/4126
- ANGLE_SKIP_TEST_IF(IsOSX() && IsOpenGL());
-
- if (getClientMajorVersion() < 3)
+ if (IsGLExtensionEnabled("NV_pixel_buffer_object"))
{
- ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
- ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
+ int width = getWindowWidth();
+ int height = getWindowHeight();
+
+ GLuint tex2D;
+ glGenTextures(1, &tex2D);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, tex2D);
+
+ // Fill with red
+ std::vector<GLubyte> pixels(3 * 16 * 16);
+ for (size_t pixelId = 0; pixelId < 16 * 16; ++pixelId)
+ {
+ pixels[pixelId * 3 + 0] = 255;
+ pixels[pixelId * 3 + 1] = 0;
+ pixels[pixelId * 3 + 2] = 0;
+ }
+
+ // Read 16x16 region from red backbuffer to PBO
+ GLuint pbo;
+ glGenBuffers(1, &pbo);
+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
+ glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * 16 * 16, pixels.data(), GL_STATIC_DRAW);
+
+ // ANGLE internally uses RGBA as the DirectX format for RGB images
+ // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
+ // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
+ glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, 16, 16);
+
+ // Initializes the color of the upper-left 8x8 pixels, leaves the other pixels untouched.
+ // glTexSubImage2D should take into account that the image is dirty.
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ setUpProgram();
+
+ glUseProgram(mProgram);
+ glUniform1i(mTexture2DUniformLocation, 0);
+ drawQuad(mProgram, "position", 0.5f);
+ glDeleteTextures(1, &tex2D);
+ glDeleteBuffers(1, &pbo);
+ EXPECT_GL_NO_ERROR();
+ EXPECT_PIXEL_EQ(3 * width / 4, 3 * height / 4, 0, 0, 0, 255);
+ EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
}
-
- const int width = getWindowWidth();
- const int height = getWindowHeight();
- const size_t pixelCount = width * height;
- const int componentCount = 3;
-
- GLuint tex2D;
- glGenTextures(1, &tex2D);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, tex2D);
-
- // Fill with red
- std::vector<GLubyte> pixels(componentCount * pixelCount);
- for (size_t pixelId = 0; pixelId < pixelCount; ++pixelId)
- {
- pixels[pixelId * componentCount + 0] = 255;
- pixels[pixelId * componentCount + 1] = 0;
- pixels[pixelId * componentCount + 2] = 0;
- }
-
- // Read 16x16 region from red backbuffer to PBO
- GLuint pbo;
- glGenBuffers(1, &pbo);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
- glBufferData(GL_PIXEL_UNPACK_BUFFER, componentCount * pixelCount, pixels.data(),
- GL_STATIC_DRAW);
-
- // ANGLE internally uses RGBA as the DirectX format for RGB images
- // therefore glTexStorage2DEXT initializes the image to a default color to get a consistent
- // alpha color. The data is kept in a CPU-side image and the image is marked as dirty.
- glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGB8, width, height);
-
- // Initializes the color of the upper-left quadrant of pixels, leaves the other pixels
- // untouched. glTexSubImage2D should take into account that the image is dirty.
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width / 2, height / 2, GL_RGB, GL_UNSIGNED_BYTE,
- nullptr);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- setUpProgram();
-
- glUseProgram(mProgram);
- glUniform1i(mTexture2DUniformLocation, 0);
- drawQuad(mProgram, "position", 0.5f);
- glDeleteTextures(1, &tex2D);
- glDeleteBuffers(1, &pbo);
- EXPECT_GL_NO_ERROR();
- EXPECT_PIXEL_EQ(3 * width / 4, 3 * height / 4, 0, 0, 0, 255);
- EXPECT_PIXEL_EQ(width / 4, height / 4, 255, 0, 0, 255);
-}
-
-// Test that glTexSubImage2D combined with a PBO works properly after deleting the PBO
-// and drawing with the texture
-// Pseudo code for the follow test:
-// 1. Upload PBO to mTexture2D
-// 2. Delete PBO
-// 3. Draw with otherTexture (x5)
-// 4. Draw with mTexture2D
-// 5. Validate color output
-TEST_P(Texture2DTest, PBOWithMultipleDraws)
-{
- if (getClientMajorVersion() < 3)
- {
- ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
- ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
- }
-
- const GLuint width = getWindowWidth();
- const GLuint height = getWindowHeight();
- const GLuint windowPixelCount = width * height;
- std::vector<GLColor> pixelsRed(windowPixelCount, GLColor::red);
- std::vector<GLColor> pixelsGreen(windowPixelCount, GLColor::green);
-
- // Create secondary draw that does not use mTexture
- const char *vertexShaderSource = getVertexShaderSource();
- const char *fragmentShaderSource = getFragmentShaderSource();
- ANGLE_GL_PROGRAM(otherProgram, vertexShaderSource, fragmentShaderSource);
-
- GLint uniformLoc = glGetUniformLocation(otherProgram, getTextureUniformName());
- ASSERT_NE(-1, uniformLoc);
- glUseProgram(0);
-
- // Create secondary Texture to draw with
- GLTexture otherTexture;
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, otherTexture);
- glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
- pixelsRed.data());
- ASSERT_GL_NO_ERROR();
-
- // Setup primary Texture
- glBindTexture(GL_TEXTURE_2D, mTexture2D);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
- ASSERT_GL_NO_ERROR();
-
- // Setup PBO
- GLuint pbo = 0;
- glGenBuffers(1, &pbo);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
- glBufferData(GL_PIXEL_UNPACK_BUFFER, pixelsGreen.size() * 4u, pixelsGreen.data(),
- GL_STATIC_DRAW);
- ASSERT_GL_NO_ERROR();
-
- // Write PBO to mTexture
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- ASSERT_GL_NO_ERROR();
- // Delete PBO as ANGLE should be properly handling refcount of this buffer
- glDeleteBuffers(1, &pbo);
- pixelsGreen.clear();
-
- // Do 5 draws not involving primary texture that the PBO updated
- glUseProgram(otherProgram);
- glUniform1i(uniformLoc, 0);
- glBindTexture(GL_TEXTURE_2D, otherTexture);
- drawQuad(otherProgram, "position", 0.5f);
- glBindTexture(GL_TEXTURE_2D, 0);
- glUseProgram(0);
-
- glUseProgram(otherProgram);
- glUniform1i(uniformLoc, 0);
- glBindTexture(GL_TEXTURE_2D, otherTexture);
- drawQuad(otherProgram, "position", 0.5f);
- glBindTexture(GL_TEXTURE_2D, 0);
- glUseProgram(0);
-
- glUseProgram(otherProgram);
- glUniform1i(uniformLoc, 0);
- glBindTexture(GL_TEXTURE_2D, otherTexture);
- drawQuad(otherProgram, "position", 0.5f);
- glBindTexture(GL_TEXTURE_2D, 0);
- glUseProgram(0);
-
- glUseProgram(otherProgram);
- glUniform1i(uniformLoc, 0);
- glBindTexture(GL_TEXTURE_2D, otherTexture);
- drawQuad(otherProgram, "position", 0.5f);
- glBindTexture(GL_TEXTURE_2D, 0);
- glUseProgram(0);
- ASSERT_GL_NO_ERROR();
-
- std::vector<GLColor> output(windowPixelCount, GLColor::black);
- glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
- output.data());
- EXPECT_EQ(pixelsRed, output);
-
- setUpProgram();
- // Draw using PBO updated texture
- glUseProgram(mProgram);
- glUniform1i(mTexture2DUniformLocation, 0);
- glBindTexture(GL_TEXTURE_2D, mTexture2D);
- drawQuad(mProgram, "position", 0.5f);
- ASSERT_GL_NO_ERROR();
-
- std::vector<GLColor> actual(windowPixelCount, GLColor::black);
- glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
- actual.data());
- // Value should be green as it was updated during PBO transfer to mTexture
- std::vector<GLColor> expected(windowPixelCount, GLColor::green);
- EXPECT_EQ(expected, actual);
}
// Tests CopySubImage for float formats
@@ -5828,65 +5676,6 @@
EXPECT_PIXEL_COLOR_EQ(width - 1, height - 1, color);
}
-// Test that uses glCompressedTexSubImage2D combined with a PBO
-TEST_P(PBOCompressedTextureTest, PBOCompressedSubImage)
-{
- // ETC texture formats are not supported on Mac OpenGL. http://anglebug.com/3853
- ANGLE_SKIP_TEST_IF(IsOSX() && IsDesktopOpenGL());
- // http://anglebug.com/4115
- ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsDesktopOpenGL());
- ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsDesktopOpenGL());
-
- if (getClientMajorVersion() < 3)
- {
- ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage"));
- ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
- ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC2_RGB8_texture"));
- }
-
- const GLuint width = 4u;
- const GLuint height = 4u;
-
- setWindowWidth(width);
- setWindowHeight(height);
-
- // Setup primary Texture
- glBindTexture(GL_TEXTURE_2D, mTexture2D);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-
- if (getClientMajorVersion() < 3)
- {
- glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, width, height);
- }
- else
- {
- glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, width, height);
- }
- ASSERT_GL_NO_ERROR();
-
- // Setup PBO and fill it with a red
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mPBO);
- glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height / 2u, kCompressedImageETC2, GL_STATIC_DRAW);
- ASSERT_GL_NO_ERROR();
-
- // Write PBO to mTexture
- glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_COMPRESSED_RGB8_ETC2,
- width * height / 2u, nullptr);
- ASSERT_GL_NO_ERROR();
-
- setUpProgram();
- // Draw using PBO updated texture
- glUseProgram(mProgram);
- glUniform1i(mTexture2DUniformLocation, 0);
- glBindTexture(GL_TEXTURE_2D, mTexture2D);
- drawQuad(mProgram, "position", 0.5f);
- ASSERT_GL_NO_ERROR();
-
- EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::red);
- ASSERT_GL_NO_ERROR();
-}
-
// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST_ES2(Texture2DTest);
@@ -5925,6 +5714,5 @@
ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayIntegerTestES3);
ANGLE_INSTANTIATE_TEST_ES3(Texture3DIntegerTestES3);
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(Texture2DDepthTest);
-ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(PBOCompressedTextureTest);
} // anonymous namespace