Files
test/source/blender/gpu/tests/gpu_testing.hh
Jeroen Bakker 4d0c14bed3 OpenGL: Fix read from uninitialized memory
When performing framebuffer transition on legacy opengl platforms, some
state was uninitialized. Resulting in incorrect behavior and crashes.

Note that this doens't fix the black cube on legacy platforms. With this PR we
might be able to reproduce the issue on modern HW.

Pull Request: https://projects.blender.org/blender/blender/pulls/123989
2024-07-02 08:37:50 +02:00

145 lines
3.2 KiB
C++

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: Apache-2.0 */
#include "testing/testing.h"
#include "BKE_global.hh"
#include "GHOST_C-api.h"
#include "GPU_platform.hh"
struct GPUContext;
namespace blender::gpu {
/**
* Test class that setups a GPUContext for test cases.
*/
class GPUTest : public ::testing::Test {
private:
GHOST_TDrawingContextType draw_context_type = GHOST_kDrawingContextTypeNone;
eGPUBackendType gpu_backend_type;
GHOST_SystemHandle ghost_system;
GHOST_ContextHandle ghost_context;
GPUContext *context;
int32_t g_debug_flags_;
int32_t prev_g_debug_;
protected:
GPUTest(GHOST_TDrawingContextType draw_context_type,
eGPUBackendType gpu_backend_type,
int32_t g_debug_flags)
: draw_context_type(draw_context_type),
gpu_backend_type(gpu_backend_type),
g_debug_flags_(g_debug_flags)
{
}
void SetUp() override;
void TearDown() override;
};
#ifdef WITH_OPENGL_BACKEND
class GPUOpenGLTest : public GPUTest {
public:
GPUOpenGLTest()
: GPUTest(GHOST_kDrawingContextTypeOpenGL,
GPU_BACKEND_OPENGL,
G_DEBUG_GPU | G_DEBUG_GPU_RENDERDOC)
{
}
};
class GPUOpenGLWorkaroundsTest : public GPUTest {
public:
GPUOpenGLWorkaroundsTest()
: GPUTest(GHOST_kDrawingContextTypeOpenGL,
GPU_BACKEND_OPENGL,
G_DEBUG_GPU | G_DEBUG_GPU_FORCE_WORKAROUNDS)
{
}
};
# define GPU_OPENGL_TEST(test_name) \
TEST_F(GPUOpenGLTest, test_name) \
{ \
test_##test_name(); \
} \
TEST_F(GPUOpenGLWorkaroundsTest, test_name) \
{ \
test_##test_name(); \
}
#else
# define GPU_OPENGL_TEST(test_name)
#endif
#ifdef WITH_METAL_BACKEND
class GPUMetalTest : public GPUTest {
public:
GPUMetalTest() : GPUTest(GHOST_kDrawingContextTypeMetal, GPU_BACKEND_METAL, G_DEBUG_GPU) {}
};
class GPUMetalWorkaroundsTest : public GPUTest {
public:
GPUMetalWorkaroundsTest()
: GPUTest(GHOST_kDrawingContextTypeMetal,
GPU_BACKEND_METAL,
G_DEBUG_GPU | G_DEBUG_GPU_FORCE_WORKAROUNDS)
{
}
};
# define GPU_METAL_TEST(test_name) \
TEST_F(GPUMetalTest, test_name) \
{ \
test_##test_name(); \
} \
TEST_F(GPUMetalWorkaroundsTest, test_name) \
{ \
test_##test_name(); \
}
#else
# define GPU_METAL_TEST(test_name)
#endif
#ifdef WITH_VULKAN_BACKEND
class GPUVulkanTest : public GPUTest {
public:
GPUVulkanTest()
: GPUTest(GHOST_kDrawingContextTypeVulkan,
GPU_BACKEND_VULKAN,
G_DEBUG_GPU | G_DEBUG_GPU_RENDERDOC)
{
}
};
class GPUVulkanWorkaroundsTest : public GPUTest {
public:
GPUVulkanWorkaroundsTest()
: GPUTest(GHOST_kDrawingContextTypeVulkan,
GPU_BACKEND_VULKAN,
G_DEBUG_GPU | G_DEBUG_GPU_RENDERDOC | G_DEBUG_GPU_FORCE_WORKAROUNDS)
{
}
};
# define GPU_VULKAN_TEST(test_name) \
TEST_F(GPUVulkanTest, test_name) \
{ \
test_##test_name(); \
} \
TEST_F(GPUVulkanWorkaroundsTest, test_name) \
{ \
test_##test_name(); \
}
#else
# define GPU_VULKAN_TEST(test_name)
#endif
#define GPU_TEST(test_name) \
GPU_OPENGL_TEST(test_name) \
GPU_METAL_TEST(test_name) \
GPU_VULKAN_TEST(test_name)
} // namespace blender::gpu