Project import generated by Copybara.
GitOrigin-RevId: 73d686c40057684f8bfaca285368bf1813f9fc26
This commit is contained in:
@@ -14,13 +14,89 @@
|
||||
|
||||
#include "mediapipe/gpu/gpu_buffer.h"
|
||||
|
||||
#include "mediapipe/framework/formats/image_format.pb.h"
|
||||
#include "mediapipe/framework/port/gmock.h"
|
||||
#include "mediapipe/framework/port/gtest.h"
|
||||
#include "mediapipe/framework/tool/test_util.h"
|
||||
#include "mediapipe/gpu/gpu_buffer_storage_image_frame.h"
|
||||
#include "mediapipe/gpu/gpu_test_base.h"
|
||||
#include "stb_image.h"
|
||||
#include "stb_image_write.h"
|
||||
|
||||
namespace mediapipe {
|
||||
namespace {
|
||||
|
||||
// Write an ImageFrame as PNG to the test undeclared outputs directory.
|
||||
// The image's name will contain the given prefix and a timestamp.
|
||||
// Returns the path to the output if successful.
|
||||
std::string SavePngImage(const mediapipe::ImageFrame& image,
|
||||
absl::string_view prefix) {
|
||||
std::string output_dir = mediapipe::GetTestOutputsDir();
|
||||
std::string now_string = absl::FormatTime(absl::Now());
|
||||
std::string out_file_path =
|
||||
absl::StrCat(output_dir, "/", prefix, "_", now_string, ".png");
|
||||
EXPECT_TRUE(stbi_write_png(out_file_path.c_str(), image.Width(),
|
||||
image.Height(), image.NumberOfChannels(),
|
||||
image.PixelData(), image.WidthStep()))
|
||||
<< " path: " << out_file_path;
|
||||
return out_file_path;
|
||||
}
|
||||
|
||||
void FillImageFrameRGBA(ImageFrame& image, uint8 r, uint8 g, uint8 b, uint8 a) {
|
||||
auto* data = image.MutablePixelData();
|
||||
for (int y = 0; y < image.Height(); ++y) {
|
||||
auto* row = data + image.WidthStep() * y;
|
||||
for (int x = 0; x < image.Width(); ++x) {
|
||||
auto* pixel = row + x * image.NumberOfChannels();
|
||||
pixel[0] = r;
|
||||
pixel[1] = g;
|
||||
pixel[2] = b;
|
||||
pixel[3] = a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Assumes a framebuffer is already set up
|
||||
void CopyGlTexture(const GlTextureView& src, GlTextureView& dst) {
|
||||
glViewport(0, 0, src.width(), src.height());
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, src.target(),
|
||||
src.name(), 0);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(dst.target(), dst.name());
|
||||
glCopyTexSubImage2D(dst.target(), 0, 0, 0, 0, 0, dst.width(), dst.height());
|
||||
|
||||
glBindTexture(dst.target(), 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, src.target(), 0,
|
||||
0);
|
||||
}
|
||||
|
||||
void FillGlTextureRgba(GlTextureView& view, float r, float g, float b,
|
||||
float a) {
|
||||
glViewport(0, 0, view.width(), view.height());
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, view.target(),
|
||||
view.name(), 0);
|
||||
glClearColor(r, g, b, a);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, view.target(), 0,
|
||||
0);
|
||||
}
|
||||
|
||||
class TempGlFramebuffer {
|
||||
public:
|
||||
TempGlFramebuffer() {
|
||||
glGenFramebuffers(1, &framebuffer_);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_);
|
||||
}
|
||||
~TempGlFramebuffer() {
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
glDeleteFramebuffers(1, &framebuffer_);
|
||||
}
|
||||
|
||||
private:
|
||||
GLuint framebuffer_;
|
||||
};
|
||||
|
||||
class GpuBufferTest : public GpuTestBase {};
|
||||
|
||||
TEST_F(GpuBufferTest, BasicTest) {
|
||||
@@ -46,5 +122,144 @@ TEST_F(GpuBufferTest, BasicTest) {
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(GpuBufferTest, GlTextureView) {
|
||||
GpuBuffer buffer(300, 200, GpuBufferFormat::kBGRA32);
|
||||
EXPECT_EQ(buffer.width(), 300);
|
||||
EXPECT_EQ(buffer.height(), 200);
|
||||
EXPECT_TRUE(buffer);
|
||||
EXPECT_FALSE(buffer == nullptr);
|
||||
|
||||
RunInGlContext([&buffer] {
|
||||
TempGlFramebuffer fb;
|
||||
auto view = buffer.GetWriteView<GlTextureView>(0);
|
||||
FillGlTextureRgba(view, 1.0, 0.0, 0.0, 1.0);
|
||||
glFlush();
|
||||
});
|
||||
std::shared_ptr<const ImageFrame> view = buffer.GetReadView<ImageFrame>();
|
||||
EXPECT_EQ(view->Width(), 300);
|
||||
EXPECT_EQ(view->Height(), 200);
|
||||
|
||||
ImageFrame red(ImageFormat::SRGBA, 300, 200);
|
||||
FillImageFrameRGBA(red, 255, 0, 0, 255);
|
||||
|
||||
EXPECT_TRUE(mediapipe::CompareImageFrames(*view, red, 0.0, 0.0));
|
||||
SavePngImage(red, "gltv_red_gold");
|
||||
SavePngImage(*view, "gltv_red_view");
|
||||
}
|
||||
|
||||
TEST_F(GpuBufferTest, ImageFrame) {
|
||||
GpuBuffer buffer(300, 200, GpuBufferFormat::kBGRA32);
|
||||
EXPECT_EQ(buffer.width(), 300);
|
||||
EXPECT_EQ(buffer.height(), 200);
|
||||
EXPECT_TRUE(buffer);
|
||||
EXPECT_FALSE(buffer == nullptr);
|
||||
|
||||
{
|
||||
std::shared_ptr<ImageFrame> view = buffer.GetWriteView<ImageFrame>();
|
||||
EXPECT_EQ(view->Width(), 300);
|
||||
EXPECT_EQ(view->Height(), 200);
|
||||
FillImageFrameRGBA(*view, 255, 0, 0, 255);
|
||||
}
|
||||
|
||||
GpuBuffer buffer2(300, 200, GpuBufferFormat::kBGRA32);
|
||||
RunInGlContext([&buffer, &buffer2] {
|
||||
TempGlFramebuffer fb;
|
||||
auto src = buffer.GetReadView<GlTextureView>(0);
|
||||
auto dst = buffer2.GetWriteView<GlTextureView>(0);
|
||||
CopyGlTexture(src, dst);
|
||||
glFlush();
|
||||
});
|
||||
{
|
||||
std::shared_ptr<const ImageFrame> view = buffer2.GetReadView<ImageFrame>();
|
||||
EXPECT_EQ(view->Width(), 300);
|
||||
EXPECT_EQ(view->Height(), 200);
|
||||
|
||||
ImageFrame red(ImageFormat::SRGBA, 300, 200);
|
||||
FillImageFrameRGBA(red, 255, 0, 0, 255);
|
||||
|
||||
EXPECT_TRUE(mediapipe::CompareImageFrames(*view, red, 0.0, 0.0));
|
||||
SavePngImage(red, "if_red_gold");
|
||||
SavePngImage(*view, "if_red_view");
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(GpuBufferTest, Overwrite) {
|
||||
GpuBuffer buffer(300, 200, GpuBufferFormat::kBGRA32);
|
||||
EXPECT_EQ(buffer.width(), 300);
|
||||
EXPECT_EQ(buffer.height(), 200);
|
||||
EXPECT_TRUE(buffer);
|
||||
EXPECT_FALSE(buffer == nullptr);
|
||||
|
||||
{
|
||||
std::shared_ptr<ImageFrame> view = buffer.GetWriteView<ImageFrame>();
|
||||
EXPECT_EQ(view->Width(), 300);
|
||||
EXPECT_EQ(view->Height(), 200);
|
||||
FillImageFrameRGBA(*view, 255, 0, 0, 255);
|
||||
}
|
||||
|
||||
GpuBuffer red_copy(300, 200, GpuBufferFormat::kBGRA32);
|
||||
RunInGlContext([&buffer, &red_copy] {
|
||||
TempGlFramebuffer fb;
|
||||
auto src = buffer.GetReadView<GlTextureView>(0);
|
||||
auto dst = red_copy.GetWriteView<GlTextureView>(0);
|
||||
CopyGlTexture(src, dst);
|
||||
glFlush();
|
||||
});
|
||||
|
||||
{
|
||||
std::shared_ptr<const ImageFrame> view = red_copy.GetReadView<ImageFrame>();
|
||||
ImageFrame red(ImageFormat::SRGBA, 300, 200);
|
||||
FillImageFrameRGBA(red, 255, 0, 0, 255);
|
||||
|
||||
EXPECT_TRUE(mediapipe::CompareImageFrames(*view, red, 0.0, 0.0));
|
||||
SavePngImage(red, "ow_red_gold");
|
||||
SavePngImage(*view, "ow_red_view");
|
||||
}
|
||||
|
||||
{
|
||||
std::shared_ptr<ImageFrame> view = buffer.GetWriteView<ImageFrame>();
|
||||
EXPECT_EQ(view->Width(), 300);
|
||||
EXPECT_EQ(view->Height(), 200);
|
||||
FillImageFrameRGBA(*view, 0, 255, 0, 255);
|
||||
}
|
||||
|
||||
GpuBuffer green_copy(300, 200, GpuBufferFormat::kBGRA32);
|
||||
RunInGlContext([&buffer, &green_copy] {
|
||||
TempGlFramebuffer fb;
|
||||
auto src = buffer.GetReadView<GlTextureView>(0);
|
||||
auto dst = green_copy.GetWriteView<GlTextureView>(0);
|
||||
CopyGlTexture(src, dst);
|
||||
glFlush();
|
||||
});
|
||||
|
||||
RunInGlContext([&buffer] {
|
||||
TempGlFramebuffer fb;
|
||||
auto view = buffer.GetWriteView<GlTextureView>(0);
|
||||
FillGlTextureRgba(view, 0.0, 0.0, 1.0, 1.0);
|
||||
glFlush();
|
||||
});
|
||||
|
||||
{
|
||||
std::shared_ptr<const ImageFrame> view =
|
||||
green_copy.GetReadView<ImageFrame>();
|
||||
ImageFrame green(ImageFormat::SRGBA, 300, 200);
|
||||
FillImageFrameRGBA(green, 0, 255, 0, 255);
|
||||
|
||||
EXPECT_TRUE(mediapipe::CompareImageFrames(*view, green, 0.0, 0.0));
|
||||
SavePngImage(green, "ow_green_gold");
|
||||
SavePngImage(*view, "ow_green_view");
|
||||
}
|
||||
|
||||
{
|
||||
std::shared_ptr<const ImageFrame> view = buffer.GetReadView<ImageFrame>();
|
||||
ImageFrame blue(ImageFormat::SRGBA, 300, 200);
|
||||
FillImageFrameRGBA(blue, 0, 0, 255, 255);
|
||||
|
||||
EXPECT_TRUE(mediapipe::CompareImageFrames(*view, blue, 0.0, 0.0));
|
||||
SavePngImage(blue, "ow_blue_gold");
|
||||
SavePngImage(*view, "ow_blue_view");
|
||||
}
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
} // namespace mediapipe
|
||||
|
||||
Reference in New Issue
Block a user