From 8c82edd3d2822a3a89114bf5559ef54b3bf6ee77 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 10 Oct 2023 19:26:31 +1100 Subject: [PATCH] add Cmake/preprocessor define to switch between ANGLE/OpenGL on Windows --- .gitattributes | 5 + example/.gitattributes | 1 + windows/CMakeLists.txt | 80 ++++--- windows/lib/Debug/{ => angle}/backend.lib | 0 windows/lib/Debug/{ => angle}/libEGL.dll | 0 windows/lib/Debug/{ => angle}/libEGL.dll.lib | 0 windows/lib/Debug/{ => angle}/libEGL.dll.pdb | 0 windows/lib/Debug/{ => angle}/libGLESv2.dll | 0 .../lib/Debug/{ => angle}/libGLESv2.dll.lib | 0 .../lib/Debug/{ => angle}/libGLESv2.dll.pdb | 0 windows/lib/Debug/{ => angle}/uberarchive.lib | 0 windows/lib/Debug/{ => opengl}/bluegl.lib | 0 windows/lib/Release/{ => angle}/backend.lib | 0 windows/lib/Release/{ => angle}/libEGL.dll | 0 .../lib/Release/{ => angle}/libEGL.dll.lib | 0 .../lib/Release/{ => angle}/libEGL.dll.pdb | 0 windows/lib/Release/{ => angle}/libGLESv2.dll | 0 .../lib/Release/{ => angle}/libGLESv2.dll.lib | 0 .../lib/Release/{ => angle}/libGLESv2.dll.pdb | 0 .../lib/Release/{ => angle}/uberarchive.lib | 0 windows/lib/Release/{ => opengl}/bluegl.lib | 0 windows/polyvox_filament_plugin.cpp | 206 ++++++++++++++++-- windows/polyvox_filament_plugin.h | 19 +- 23 files changed, 254 insertions(+), 57 deletions(-) rename windows/lib/Debug/{ => angle}/backend.lib (100%) rename windows/lib/Debug/{ => angle}/libEGL.dll (100%) rename windows/lib/Debug/{ => angle}/libEGL.dll.lib (100%) rename windows/lib/Debug/{ => angle}/libEGL.dll.pdb (100%) rename windows/lib/Debug/{ => angle}/libGLESv2.dll (100%) rename windows/lib/Debug/{ => angle}/libGLESv2.dll.lib (100%) rename windows/lib/Debug/{ => angle}/libGLESv2.dll.pdb (100%) rename windows/lib/Debug/{ => angle}/uberarchive.lib (100%) rename windows/lib/Debug/{ => opengl}/bluegl.lib (100%) rename windows/lib/Release/{ => angle}/backend.lib (100%) rename windows/lib/Release/{ => angle}/libEGL.dll (100%) rename windows/lib/Release/{ => angle}/libEGL.dll.lib (100%) rename windows/lib/Release/{ => angle}/libEGL.dll.pdb (100%) rename windows/lib/Release/{ => angle}/libGLESv2.dll (100%) rename windows/lib/Release/{ => angle}/libGLESv2.dll.lib (100%) rename windows/lib/Release/{ => angle}/libGLESv2.dll.pdb (100%) rename windows/lib/Release/{ => angle}/uberarchive.lib (100%) rename windows/lib/Release/{ => opengl}/bluegl.lib (100%) diff --git a/.gitattributes b/.gitattributes index e3f0f4a8..3b4d0db7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -589,3 +589,8 @@ example/assets/BusterDrone/textures/body_metallicRoughness.jpg filter=lfs diff=l example/assets/FlightHelmet/FlightHelmet.bin filter=lfs diff=lfs merge=lfs -text example/assets/FlightHelmet/FlightHelmet_baseColor3.png filter=lfs diff=lfs merge=lfs -text assets/default.uberz filter=lfs diff=lfs merge=lfs -text +windows/lib/**/*.* filter=lfs diff=lfs merge=lfs -text +windows/lib/Debug/angle/* filter=lfs diff=lfs merge=lfs -text +windows/lib/Debug/opengl/* filter=lfs diff=lfs merge=lfs -text +windows/lib/Release/opengl/* filter=lfs diff=lfs merge=lfs -text +windows/lib/Release/angle/* filter=lfs diff=lfs merge=lfs -text diff --git a/example/.gitattributes b/example/.gitattributes index f1636a02..2f26b9aa 100644 --- a/example/.gitattributes +++ b/example/.gitattributes @@ -2,3 +2,4 @@ assets/lit_opaque_43.uberz filter=lfs diff=lfs merge=lfs -text assets/BusterDrone filter=lfs diff=lfs merge=lfs -text assets/FlightHelmet filter=lfs diff=lfs merge=lfs -text assets/lit_opaque_32.uberz filter=lfs diff=lfs merge=lfs -text +windows/lib/**/*.* filter=lfs diff=lfs merge=lfs -text diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 8c424a0b..2a632522 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -12,7 +12,6 @@ set(PLUGIN_NAME "polyvox_filament_plugin") list(APPEND PLUGIN_SOURCES "polyvox_filament_plugin.cpp" "polyvox_filament_plugin.h" - "PlatformAngle.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/AssetManager.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/FilamentViewer.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/PolyvoxFilamentApi.cpp" @@ -21,6 +20,14 @@ list(APPEND PLUGIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/TimeIt.cpp" ) +set(USE_ANGLE TRUE) + +add_compile_definitions(USE_ANGLE=${USE_ANGLE}) + +if(USE_ANGLE) + list(APPEND PLUGIN_SOURCES "PlatformAngle.cpp") +endif() + # Define the plugin library target. Its name must not be changed (see comment # on PLUGIN_NAME above). add_library(${PLUGIN_NAME} SHARED @@ -43,15 +50,37 @@ target_include_directories(${PLUGIN_NAME} INTERFACE ) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include/filament") - -add_library(EGL SHARED IMPORTED) -set_property(TARGET EGL PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/libEGL.dll.lib") -set_property(TARGET EGL PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/libEGL.dll.lib") -set_property(TARGET EGL PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/libEGL.dll.lib") -add_library(GLESv2 SHARED IMPORTED) -set_property(TARGET GLESv2 PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/libGLESv2.dll.lib") -set_property(TARGET GLESv2 PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/libGLESv2.dll.lib") -set_property(TARGET GLESv2 PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/libGLESv2.dll.lib") + +if(USE_ANGLE) + list(APPEND GL_LIBS + EGL + GLESv2 + ) + set(ANGLE_OR_OPENGL_DIR angle) + add_library(EGL SHARED IMPORTED) + set_property(TARGET EGL PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/angle/libEGL.dll.lib") + set_property(TARGET EGL PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/angle/libEGL.dll.lib") + set_property(TARGET EGL PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/angle/libEGL.dll.lib") + add_library(GLESv2 SHARED IMPORTED) + set_property(TARGET GLESv2 PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/angle/libGLESv2.dll.lib") + set_property(TARGET GLESv2 PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/angle/libGLESv2.dll.lib") + set_property(TARGET GLESv2 PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/angle/libGLESv2.dll.lib") +else() + list(APPEND GL_LIBS + bluegl + opengl32 + ) + set(ANGLE_OR_OPENGL_DIR opengl) + add_library(bluegl SHARED IMPORTED) + set_property(TARGET bluegl PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/opengl/bluegl.lib") + set_property(TARGET bluegl PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/opengl/bluegl.lib") + set_property(TARGET bluegl PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/opengl/bluegl.lib") +endif() + +add_library(backend SHARED IMPORTED) +set_property(TARGET backend PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/${ANGLE_OR_OPENGL_DIR}/backend.lib") +set_property(TARGET backend PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/${ANGLE_OR_OPENGL_DIR}/backend.lib") +set_property(TARGET backend PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/${ANGLE_OR_OPENGL_DIR}/backend.lib") add_library(geometry SHARED IMPORTED) set_property(TARGET geometry PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/geometry.lib") @@ -63,11 +92,6 @@ set_property(TARGET filament PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOU set_property(TARGET filament PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/filament.lib") set_property(TARGET filament PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/filament.lib") -add_library(backend SHARED IMPORTED) -set_property(TARGET backend PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/backend.lib") -set_property(TARGET backend PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/backend.lib") -set_property(TARGET backend PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/backend.lib") - add_library(filameshio SHARED IMPORTED) set_property(TARGET filameshio PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/filameshio.lib") set_property(TARGET filameshio PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/filameshio.lib") @@ -164,9 +188,9 @@ set_property(TARGET smol-v PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SO set_property(TARGET smol-v PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/smol-v.lib") add_library(uberarchive SHARED IMPORTED) -set_property(TARGET uberarchive PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/uberarchive.lib") -set_property(TARGET uberarchive PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/uberarchive.lib") -set_property(TARGET uberarchive PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/uberarchive.lib") +set_property(TARGET uberarchive PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/${ANGLE_OR_OPENGL_DIR}/uberarchive.lib") +set_property(TARGET uberarchive PROPERTY IMPORTED_IMPLIB_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/${ANGLE_OR_OPENGL_DIR}/uberarchive.lib") +set_property(TARGET uberarchive PROPERTY IMPORTED_IMPLIB_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/lib/Release/${ANGLE_OR_OPENGL_DIR}/uberarchive.lib") add_library(meshoptimizer SHARED IMPORTED) set_property(TARGET meshoptimizer PROPERTY IMPORTED_IMPLIB_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/meshoptimizer.lib") @@ -199,9 +223,9 @@ include_directories( ) target_link_libraries(${PLUGIN_NAME} PRIVATE -flutter -flutter_wrapper_plugin - gltfio + flutter + flutter_wrapper_plugin + gltfio gltfio_core filament backend @@ -228,22 +252,18 @@ flutter_wrapper_plugin png tinyexr Shlwapi - EGL - GLESv2 + ${GL_LIBS} ) # List of absolute paths to libraries that should be bundled with the plugin +if(USE_ANGLE) set(polyvox_filament_bundled_libraries - ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/libEGL.dll - ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/libGLESv2.dll + ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/angle/libEGL.dll + ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/angle/libGLESv2.dll ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/libc++.dll ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/third_party_abseil-cpp_absl.dll ${CMAKE_CURRENT_SOURCE_DIR}/lib/Debug/third_party_zlib.dll PARENT_SCOPE ) +endif() -# get_cmake_property(_variableNames VARIABLES) -# list (SORT _variableNames) -# foreach (_variableName ${_variableNames}) -# message(STATUS "${_variableName}FOO=BAR${${_variableName}}") -# endforeach() \ No newline at end of file diff --git a/windows/lib/Debug/backend.lib b/windows/lib/Debug/angle/backend.lib similarity index 100% rename from windows/lib/Debug/backend.lib rename to windows/lib/Debug/angle/backend.lib diff --git a/windows/lib/Debug/libEGL.dll b/windows/lib/Debug/angle/libEGL.dll similarity index 100% rename from windows/lib/Debug/libEGL.dll rename to windows/lib/Debug/angle/libEGL.dll diff --git a/windows/lib/Debug/libEGL.dll.lib b/windows/lib/Debug/angle/libEGL.dll.lib similarity index 100% rename from windows/lib/Debug/libEGL.dll.lib rename to windows/lib/Debug/angle/libEGL.dll.lib diff --git a/windows/lib/Debug/libEGL.dll.pdb b/windows/lib/Debug/angle/libEGL.dll.pdb similarity index 100% rename from windows/lib/Debug/libEGL.dll.pdb rename to windows/lib/Debug/angle/libEGL.dll.pdb diff --git a/windows/lib/Debug/libGLESv2.dll b/windows/lib/Debug/angle/libGLESv2.dll similarity index 100% rename from windows/lib/Debug/libGLESv2.dll rename to windows/lib/Debug/angle/libGLESv2.dll diff --git a/windows/lib/Debug/libGLESv2.dll.lib b/windows/lib/Debug/angle/libGLESv2.dll.lib similarity index 100% rename from windows/lib/Debug/libGLESv2.dll.lib rename to windows/lib/Debug/angle/libGLESv2.dll.lib diff --git a/windows/lib/Debug/libGLESv2.dll.pdb b/windows/lib/Debug/angle/libGLESv2.dll.pdb similarity index 100% rename from windows/lib/Debug/libGLESv2.dll.pdb rename to windows/lib/Debug/angle/libGLESv2.dll.pdb diff --git a/windows/lib/Debug/uberarchive.lib b/windows/lib/Debug/angle/uberarchive.lib similarity index 100% rename from windows/lib/Debug/uberarchive.lib rename to windows/lib/Debug/angle/uberarchive.lib diff --git a/windows/lib/Debug/bluegl.lib b/windows/lib/Debug/opengl/bluegl.lib similarity index 100% rename from windows/lib/Debug/bluegl.lib rename to windows/lib/Debug/opengl/bluegl.lib diff --git a/windows/lib/Release/backend.lib b/windows/lib/Release/angle/backend.lib similarity index 100% rename from windows/lib/Release/backend.lib rename to windows/lib/Release/angle/backend.lib diff --git a/windows/lib/Release/libEGL.dll b/windows/lib/Release/angle/libEGL.dll similarity index 100% rename from windows/lib/Release/libEGL.dll rename to windows/lib/Release/angle/libEGL.dll diff --git a/windows/lib/Release/libEGL.dll.lib b/windows/lib/Release/angle/libEGL.dll.lib similarity index 100% rename from windows/lib/Release/libEGL.dll.lib rename to windows/lib/Release/angle/libEGL.dll.lib diff --git a/windows/lib/Release/libEGL.dll.pdb b/windows/lib/Release/angle/libEGL.dll.pdb similarity index 100% rename from windows/lib/Release/libEGL.dll.pdb rename to windows/lib/Release/angle/libEGL.dll.pdb diff --git a/windows/lib/Release/libGLESv2.dll b/windows/lib/Release/angle/libGLESv2.dll similarity index 100% rename from windows/lib/Release/libGLESv2.dll rename to windows/lib/Release/angle/libGLESv2.dll diff --git a/windows/lib/Release/libGLESv2.dll.lib b/windows/lib/Release/angle/libGLESv2.dll.lib similarity index 100% rename from windows/lib/Release/libGLESv2.dll.lib rename to windows/lib/Release/angle/libGLESv2.dll.lib diff --git a/windows/lib/Release/libGLESv2.dll.pdb b/windows/lib/Release/angle/libGLESv2.dll.pdb similarity index 100% rename from windows/lib/Release/libGLESv2.dll.pdb rename to windows/lib/Release/angle/libGLESv2.dll.pdb diff --git a/windows/lib/Release/uberarchive.lib b/windows/lib/Release/angle/uberarchive.lib similarity index 100% rename from windows/lib/Release/uberarchive.lib rename to windows/lib/Release/angle/uberarchive.lib diff --git a/windows/lib/Release/bluegl.lib b/windows/lib/Release/opengl/bluegl.lib similarity index 100% rename from windows/lib/Release/bluegl.lib rename to windows/lib/Release/opengl/bluegl.lib diff --git a/windows/polyvox_filament_plugin.cpp b/windows/polyvox_filament_plugin.cpp index 4438637e..6fa9cd1c 100644 --- a/windows/polyvox_filament_plugin.cpp +++ b/windows/polyvox_filament_plugin.cpp @@ -29,7 +29,10 @@ #include #include "PolyvoxFilamentApi.h" +#ifdef USE_ANGLE #include "PlatformANGLE.h" +#endif + #include "GL/GL.h" #include "GL/GLu.h" #include "GL/wglext.h" @@ -137,21 +140,16 @@ void render_callback(void* owner) { // this is the method on PolyvoxFilamentPlugin that will copy between D3D textures void PolyvoxFilamentPlugin::RenderCallback() { + #ifdef USE_ANGLE _D3D11DeviceContext->CopyResource(_externalD3DTexture2D.Get(), _internalD3DTexture2D.Get()); _D3D11DeviceContext->Flush(); + #endif _textureRegistrar->MarkTextureFrameAvailable(_flutterTextureId); } -void PolyvoxFilamentPlugin::CreateTexture( - const flutter::MethodCall &methodCall, - std::unique_ptr> result) { - - const auto *args = - std::get_if(methodCall.arguments()); - - const auto width = (uint32_t)round(*(std::get_if(&(args->at(0))))); - const auto height = (uint32_t)round(*(std::get_if(&(args->at(1))))); +#ifdef USE_ANGLE +bool PolyvoxFilamentPlugin::MakeD3DTexture(uint32_t width, uint32_t height,std::unique_ptr> result) { // D3D starts here IDXGIAdapter* adapter_ = nullptr; @@ -180,7 +178,7 @@ void PolyvoxFilamentPlugin::CreateTexture( dxgi->Release(); if (!adapter_) { result->Error("ERROR", "Failed to locate default D3D adapter", nullptr); - return; + return false; } DXGI_ADAPTER_DESC adapter_desc_; @@ -194,7 +192,7 @@ void PolyvoxFilamentPlugin::CreateTexture( if (FAILED(hr)) { result->Error("ERROR", "Failed to create D3D device", nullptr); - return; + return false; } Microsoft::WRL::ComPtr dxgi_device = nullptr; @@ -227,19 +225,19 @@ void PolyvoxFilamentPlugin::CreateTexture( if FAILED(hr) { result->Error("ERROR", "Failed to create D3D texture", nullptr); - return; + return false; } auto resource = Microsoft::WRL::ComPtr{}; hr = _internalD3DTexture2D.As(&resource); if FAILED(hr) { result->Error("ERROR", "Failed to create D3D texture", nullptr); - return; + return false; } hr = resource->GetSharedHandle(&_internalD3DTextureHandle); if FAILED(hr) { result->Error("ERROR", "Failed to get shared handle to D3D texture", nullptr); - return; + return false; } _internalD3DTexture2D->AddRef(); @@ -250,25 +248,25 @@ void PolyvoxFilamentPlugin::CreateTexture( if FAILED(hr) { result->Error("ERROR", "Failed to create D3D texture", nullptr); - return; + return false; } hr = _externalD3DTexture2D.As(&resource); if FAILED(hr) { result->Error("ERROR", "Failed to create D3D texture", nullptr); - return; + return false; } hr = resource->GetSharedHandle(&_externalD3DTextureHandle); if FAILED(hr) { result->Error("ERROR", "Failed to get shared handle to external D3D texture", nullptr); - return; + return false; } _externalD3DTexture2D->AddRef(); std::cout << "Created external D3D texture" << std::endl; _platform = new filament::backend::PlatformANGLE(_internalD3DTextureHandle, width, height); - + _textureDescriptor = std::make_unique(); _textureDescriptor->struct_size = sizeof(FlutterDesktopGpuSurfaceDescriptor); _textureDescriptor->handle = _externalD3DTextureHandle; @@ -286,17 +284,174 @@ void PolyvoxFilamentPlugin::CreateTexture( _flutterTextureId = _textureRegistrar->RegisterTexture(_texture.get()); std::cout << "Registered Flutter texture ID " << _flutterTextureId << std::endl; - _D3D11DeviceContext->CopyResource(_externalD3DTexture2D.Get(), - _internalD3DTexture2D.Get()); - _D3D11DeviceContext->Flush(); - - _textureRegistrar->MarkTextureFrameAvailable(_flutterTextureId); - std::vector resultList; resultList.push_back(flutter::EncodableValue(_flutterTextureId)); resultList.push_back(flutter::EncodableValue((int64_t)nullptr)); resultList.push_back(flutter::EncodableValue(_platform->glTextureId)); result->Success(resultList); + return true; +} +#else +bool PolyvoxFilamentPlugin::MakeOpenGLTexture(uint32_t width, uint32_t height,std::unique_ptr> result) { + HWND hwnd = _pluginRegistrar->GetView() + ->GetNativeWindow();; + + HDC whdc = GetDC(hwnd); + if (whdc == NULL) { + result->Error("ERROR", "No device context for temporary window", nullptr); + return false; + } + + PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), + 1, + PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, // Flags + PFD_TYPE_RGBA, // The kind of framebuffer. RGBA or palette. + 32, // Colordepth of the framebuffer. + 0, 0, 0, 0, 0, 0, + 0, + 0, + 0, + 0, 0, 0, 0, + 32, // Number of bits for the depthbuffer + 0, // Number of bits for the stencilbuffer + 0, // Number of Aux buffers in the framebuffer. + PFD_MAIN_PLANE, + 0, + 0, 0, 0 + }; + + int pixelFormat = ChoosePixelFormat(whdc, &pfd); + SetPixelFormat(whdc, pixelFormat, &pfd); + + // We need a tmp context to retrieve and call wglCreateContextAttribsARB. + HGLRC tempContext = wglCreateContext(whdc); + if (!wglMakeCurrent(whdc, tempContext)) { + result->Error("ERROR", "Failed to acquire temporary context", nullptr); + return false; + } + + GLenum err = glGetError(); + + if(err != GL_NO_ERROR) { + result->Error("ERROR", "GL Error @ 455 %d", err); + return false; + } + + PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribs = nullptr; + + wglCreateContextAttribs = + (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress( + "wglCreateContextAttribsARB"); + + if (!wglCreateContextAttribs) { + result->Error("ERROR", "Failed to resolve wglCreateContextAttribsARB", + nullptr); + return false; + } + + for (int minor = 5; minor >= 1; minor--) { + std::vector mAttribs = {WGL_CONTEXT_MAJOR_VERSION_ARB, 4, + WGL_CONTEXT_MINOR_VERSION_ARB, minor, 0}; + _context = wglCreateContextAttribs(whdc, nullptr, mAttribs.data()); + if (_context) { + break; + } + } + + wglMakeCurrent(NULL, NULL); + wglDeleteContext(tempContext); + + + if (!_context || !wglMakeCurrent(whdc, _context)) { + result->Error("ERROR", "Failed to create OpenGL context."); + return false; + } + + glGenTextures(1, &_glTextureId); + + if(_glTextureId == 0) { + result->Error("ERROR", "Failed to generate texture, OpenGL err was %d", glGetError()); + return false; + } + + glBindTexture(GL_TEXTURE_2D, _glTextureId); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, + GL_UNSIGNED_BYTE, 0); + + err = glGetError(); + + if (err != GL_NO_ERROR) { + result->Error("ERROR", "Failed to generate texture, GL error was %d", err); + return false; + } + + _pixelData.reset(new uint8_t[width * height * 4]); + _pixelBuffer = std::make_unique(); + _pixelBuffer->buffer = _pixelData.get(); + + _pixelBuffer->width = size_t(width); + _pixelBuffer->height = size_t(height); + + _texture = std::make_unique(flutter::PixelBufferTexture( + [=](size_t width, + size_t height) -> const FlutterDesktopPixelBuffer * { + std::lock_guard guard(_renderMutex); + + if(!_context || !wglMakeCurrent(whdc, _context)) { + std::cout << "Failed to switch OpenGL context." << std::endl; + } else { + uint8_t* data = new uint8_t[width*height*4]; + glBindTexture(GL_TEXTURE_2D, _glTextureId); + glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_BYTE,data); + + GLenum err = glGetError(); + + if(err != GL_NO_ERROR) { + if(err == GL_INVALID_OPERATION) { + std::cout << "Invalid op" << std::endl; + } else if(err == GL_INVALID_VALUE) { + std::cout << "Invalid value" << std::endl; + } else if(err == GL_OUT_OF_MEMORY) { + std::cout << "Out of mem" << std::endl; + } else if(err == GL_INVALID_ENUM ) { + std::cout << "Invalid enum" << std::endl; + } else { + std::cout << "Unknown error" << std::endl; + } + } + glFinish(); + _pixelData.reset(data); + wglMakeCurrent(NULL, NULL); + } + _pixelBuffer->buffer = _pixelData.get(); + + return _pixelBuffer.get(); + })); + +} +#endif + +void PolyvoxFilamentPlugin::CreateTexture( + const flutter::MethodCall &methodCall, + std::unique_ptr> result) { + + const auto *args = + std::get_if(methodCall.arguments()); + + const auto width = (uint32_t)round(*(std::get_if(&(args->at(0))))); + const auto height = (uint32_t)round(*(std::get_if(&(args->at(1))))); + + #ifdef USE_ANGLE + bool success = MakeD3DTexture(width, height, std::move(result)); + #else + bool success = MakeOpenGLTexture(width, height, std::move(result)); + #endif + if(!success) { + return; + } } @@ -321,6 +476,9 @@ void PolyvoxFilamentPlugin::HandleMethodCall( } else if(methodCall.method_name() == "getDriverPlatform") { result->Success(flutter::EncodableValue((int64_t)_platform)); } + else { + result->Error("NOT_IMPLEMENTED", "Method is not implemented %s", methodCall.method_name()); + } } } // namespace polyvox_filament diff --git a/windows/polyvox_filament_plugin.h b/windows/polyvox_filament_plugin.h index 7d6a6f25..05869d7c 100644 --- a/windows/polyvox_filament_plugin.h +++ b/windows/polyvox_filament_plugin.h @@ -11,17 +11,21 @@ #include #include +#ifdef USE_ANGLE #include #include +#endif #include "GL/GL.h" #include "GL/GLu.h" +#ifdef USE_ANGLE #include "EGL/egl.h" #include "EGL/eglext.h" #include "EGL/eglplatform.h" #include "GLES2/gl2.h" #include "GLES2/gl2ext.h" +#endif #include "PolyvoxFilamentApi.h" #include "PlatformAngle.h" @@ -59,9 +63,7 @@ public: int64_t _flutterTextureId; - GLuint _glTextureId = 0; - - // D3D + #ifdef USE_ANGLE // Device ID3D11Device* _D3D11Device = nullptr; ID3D11DeviceContext* _D3D11DeviceContext = nullptr; @@ -71,6 +73,12 @@ public: HANDLE _externalD3DTextureHandle = nullptr; HANDLE _internalD3DTextureHandle = nullptr; filament::backend::PlatformANGLE* _platform = nullptr; + #else + // OpenGL + HGLRC _context = NULL; + GLuint _glTextureId = 0; + std::mutex _renderMutex; + #endif void CreateTexture( const flutter::MethodCall &methodCall, @@ -80,6 +88,11 @@ public: ResourceBuffer loadResource(const char *path); void freeResource(ResourceBuffer rbuf); + #ifdef USE_ANGLE + bool MakeD3DTexture(uint32_t width, uint32_t height, std::unique_ptr> result); + #else + bool MakeOpenGLTexture(uint32_t width, uint32_t height, std::unique_ptr> result); + #endif }; } // namespace polyvox_filament