SWDEV-565719 - Enable GL Interop Tests on Windows (#1808)

* SWDEV-565719 - Enable GL Interop Tests on Windows

* SWDEV-565719 - Define USE_EGL feature

* Update projects/hip-tests/catch/unit/gl_interop/gl_interop_common.hh

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* SWDEV-565719 - Add glewInit

* SWDEV-565719 - Remove incorrect glutExit()

* Refactor GL interop build configuration

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: JeniferC99 <150404595+JeniferC99@users.noreply.github.com>
此提交包含在:
Jin Jung
2025-12-02 08:19:07 -08:00
提交者 GitHub
父節點 3a7b5571c0
當前提交 3e25decb39
共有 2 個檔案被更改,包括 114 行新增23 行删除
+70 -8
查看文件
@@ -9,22 +9,84 @@ set(TEST_SRC
hipGraphicsUnregisterResource.cc
)
find_package(OpenGL COMPONENTS OpenGL EGL)
# Find OpenGL with optional EGL support
find_package(OpenGL COMPONENTS OpenGL OPTIONAL_COMPONENTS EGL)
message(STATUS "OpenGL_FOUND: ${OpenGL_FOUND}")
if(NOT OpenGL_FOUND)
message(STATUS "OpenGL not found, OpenGL interop tests not enabled.")
if(NOT OpenGL_FOUND OR NOT TARGET OpenGL::GL)
message(STATUS "OpenGL not found or OpenGL::GL target unavailable, "
"OpenGL interop tests not enabled.")
return()
endif()
find_package(GLUT)
message(STATUS "GLUT_FOUND: ${GLUT_FOUND}")
if(NOT GLUT_FOUND)
message(STATUS "GLUT not found, OpenGL interop tests not enabled.")
if (OpenGL_EGL_FOUND)
message(STATUS "OpenGL::EGL: Found")
endif()
# Handle GLUT - env vars first, then find_package
set(USE_ENV_GLUT FALSE)
if (DEFINED ENV{GLUT_glut_LIBRARY} AND
DEFINED ENV{GLUT_INCLUDE_DIR})
if (NOT "$ENV{GLUT_glut_LIBRARY}" STREQUAL "" AND
NOT "$ENV{GLUT_INCLUDE_DIR}" STREQUAL "")
if (EXISTS "$ENV{GLUT_glut_LIBRARY}" AND
EXISTS "$ENV{GLUT_INCLUDE_DIR}")
set(USE_ENV_GLUT TRUE)
else()
message(WARNING "GLUT env vars invalid, using find_package")
endif()
endif()
endif()
if (USE_ENV_GLUT)
message(STATUS "Using GLUT from environment variables")
message(STATUS " GLUT_glut_LIBRARY: $ENV{GLUT_glut_LIBRARY}")
message(STATUS " GLUT_INCLUDE_DIR: $ENV{GLUT_INCLUDE_DIR}")
set(GLUT_glut_LIBRARY "$ENV{GLUT_glut_LIBRARY}"
CACHE FILEPATH "Path to GLUT library")
set(GLUT_INCLUDE_DIR "$ENV{GLUT_INCLUDE_DIR}"
CACHE PATH "Path to GLUT include directory")
add_library(GLUT::GLUT UNKNOWN IMPORTED)
set_target_properties(GLUT::GLUT PROPERTIES
IMPORTED_LOCATION "${GLUT_glut_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${GLUT_INCLUDE_DIR}"
)
else()
message(STATUS "Searching for GLUT via find_package...")
find_package(GLUT)
if (NOT GLUT_FOUND)
message(STATUS "GLUT not found, OpenGL interop tests not enabled.")
return()
endif()
message(STATUS "GLUT_FOUND: ${GLUT_FOUND}")
endif()
# GLEW is required on Windows for OpenGL extension access
# On Linux, extensions are available via native headers
find_package(GLEW)
if(WIN32 AND NOT GLEW_FOUND)
message(STATUS "GLEW required on Windows but not found, "
"GL interop tests not enabled.")
return()
endif()
# Create test executable
hip_add_exe_to_target(NAME GLInteropTest
TEST_SRC ${TEST_SRC}
TEST_TARGET_NAME build_tests
COMPILE_OPTIONS -std=c++17)
target_link_libraries(GLInteropTest OpenGL::GL OpenGL::EGL GLUT::GLUT)
# Link dependencies
target_link_libraries(GLInteropTest OpenGL::GL GLUT::GLUT)
if (OpenGL_EGL_FOUND)
target_link_libraries(GLInteropTest OpenGL::EGL)
target_compile_definitions(GLInteropTest PRIVATE USE_EGL)
endif()
if (GLEW_FOUND)
target_link_libraries(GLInteropTest GLEW::GLEW)
target_compile_definitions(GLInteropTest PRIVATE USE_GLEW)
endif()
+44 -15
查看文件
@@ -22,14 +22,21 @@ THE SOFTWARE.
#pragma once
#include <variant>
#ifdef USE_GLEW
#include <GL/glew.h>
#elif defined(__linux__)
#define GL_GLEXT_PROTOTYPES
#include <GL/freeglut.h>
#include <GL/freeglut_ext.h>
#else
#error "GLEW is required on non-Linux platforms. Define USE_GLEW and link" \
" against the GLEW library, or build on Linux."
#endif
#include <GL/freeglut.h>
#ifdef USE_EGL
#include <EGL/egl.h>
#include <EGL/eglext.h>
#endif
#include <hip_test_common.hh>
@@ -77,6 +84,11 @@ class GLImageObject {
GLuint tex_;
};
class IContextScopeGuard {
public:
virtual ~IContextScopeGuard() = default;
};
static std::once_flag glut_init_flag;
static void GlutError(const char *fmt, va_list ap)
{
@@ -93,14 +105,16 @@ static void GlutError(const char *fmt, va_list ap)
exit(1);
}
class GLUTContextScopeGuard {
class GLUTContextScopeGuard : public IContextScopeGuard {
public:
GLUTContextScopeGuard() {
std::call_once(glut_init_flag, &GLUTContextScopeGuard::init);
glut_window_ = glutCreateWindow("");
}
~GLUTContextScopeGuard() { glutDestroyWindow(glut_window_); }
~GLUTContextScopeGuard() override {
glutDestroyWindow(glut_window_);
}
GLUTContextScopeGuard(const GLUTContextScopeGuard&) = delete;
GLUTContextScopeGuard& operator=(const GLUTContextScopeGuard&) = delete;
@@ -122,7 +136,8 @@ class GLUTContextScopeGuard {
}
};
class EGLContextScopeGuard {
#ifdef USE_EGL
class EGLContextScopeGuard : public IContextScopeGuard {
public:
EGLContextScopeGuard() {
@@ -156,7 +171,7 @@ class EGLContextScopeGuard {
REQUIRE(eglMakeCurrent(egl_display_, egl_surface_, egl_surface_, egl_context_));
}
~EGLContextScopeGuard() {
~EGLContextScopeGuard() override {
// 6. Terminate EGL when finished
eglTerminate(egl_display_);
}
@@ -198,13 +213,11 @@ class EGLContextScopeGuard {
EGLSurface egl_surface_;
EGLContext egl_context_;
};
#endif
class GLContextScopeGuard {
public:
using GLUTContextScopeGuardPtr = std::unique_ptr<GLUTContextScopeGuard>;
using EGLContextScopeGuardPtr = std::unique_ptr<EGLContextScopeGuard>;
using GLContextScopeGuardVariant =
std::variant<GLUTContextScopeGuardPtr, EGLContextScopeGuardPtr>;
using GLContextScopeGuardPtr = std::unique_ptr<IContextScopeGuard>;
static constexpr char kEnvarName[] = "GL_CONTEXT_TYPE";
@@ -220,13 +233,29 @@ class GLContextScopeGuard {
if (val_str.empty() || val_str == "GLUT") {
gl_context_ = std::make_unique<GLUTContextScopeGuard>();
#ifdef USE_EGL
} else if (val_str == "EGL") {
gl_context_ = std::make_unique<EGLContextScopeGuard>();
#endif
} else {
INFO("Unsupported " << kEnvarName << " value '" << val_str << "'");
INFO("Supported values are ['GLUT', 'EGL']");
INFO("Supported values are ['GLUT'"
#ifdef USE_EGL
<< ", 'EGL'"
#endif
<< "]");
REQUIRE(false);
}
#ifdef USE_GLEW
GLenum err = glewInit();
if (err != GLEW_OK) {
fprintf(stderr, "GLEW initialization failed: %s\n",
glewGetErrorString(err));
HipTest::HIP_SKIP_TEST("GLEW Init Failed");
exit(1);
}
#endif
}
GLContextScopeGuard(const GLContextScopeGuard&) = delete;
@@ -236,5 +265,5 @@ class GLContextScopeGuard {
GLContextScopeGuard& operator=(GLContextScopeGuard&&) = delete;
private:
GLContextScopeGuardVariant gl_context_;
};
GLContextScopeGuardPtr gl_context_;
};