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
145 lines
3.2 KiB
C++
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
|