From b13c5c950a43f0f4320b6a33c56b821e94b9ae33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 17 Jun 2021 23:57:01 +0200 Subject: [PATCH] OpenGLRenderer: Implement face filling --- include/Nazara/OpenGLRenderer/Utils.hpp | 1 + include/Nazara/OpenGLRenderer/Utils.inl | 13 +++++++++++++ .../OpenGLRenderer/Wrapper/CoreFunctions.hpp | 6 ++++++ include/Nazara/Renderer/RenderDeviceInfo.hpp | 1 + src/Nazara/Graphics/Graphics.cpp | 1 + src/Nazara/OpenGLRenderer/OpenGLDevice.cpp | 3 +++ src/Nazara/OpenGLRenderer/Wrapper/Context.cpp | 14 +++++++++----- src/Nazara/VulkanRenderer/Vulkan.cpp | 3 ++- 8 files changed, 36 insertions(+), 6 deletions(-) diff --git a/include/Nazara/OpenGLRenderer/Utils.hpp b/include/Nazara/OpenGLRenderer/Utils.hpp index a51cafc93..0a0f635f2 100644 --- a/include/Nazara/OpenGLRenderer/Utils.hpp +++ b/include/Nazara/OpenGLRenderer/Utils.hpp @@ -31,6 +31,7 @@ namespace Nz inline GLenum ToOpenGL(BlendEquation blendEquation); inline GLenum ToOpenGL(BlendFunc blendFunc); + inline GLenum ToOpenGL(FaceFilling filling); inline GLenum ToOpenGL(FaceSide side); inline GLenum ToOpenGL(FrontFace face); inline GLenum ToOpenGL(PrimitiveMode primitiveMode); diff --git a/include/Nazara/OpenGLRenderer/Utils.inl b/include/Nazara/OpenGLRenderer/Utils.inl index a9585d88a..7b85e519d 100644 --- a/include/Nazara/OpenGLRenderer/Utils.inl +++ b/include/Nazara/OpenGLRenderer/Utils.inl @@ -74,6 +74,19 @@ namespace Nz NazaraError("Unhandled BlendFunc 0x" + NumberToString(UnderlyingCast(blendFunc), 16)); return {}; } + + inline GLenum ToOpenGL(FaceFilling side) + { + switch (side) + { + case FaceFilling::Fill: return GL_FILL; + case FaceFilling::Line: return GL_LINE; + case FaceFilling::Point: return GL_POINT; + } + + NazaraError("Unhandled FaceFilling 0x" + NumberToString(UnderlyingCast(side), 16)); + return {}; + } inline GLenum ToOpenGL(FaceSide side) { diff --git a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp index 851d482e4..34eab95bd 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp @@ -12,8 +12,12 @@ #include // Define some OpenGL (not ES) extensions +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 #define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 #define GL_SPIR_V_BINARY_ARB 0x9552 +typedef void (GL_APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode); typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar* pEntryPoint, GLuint numSpecializationConstants, const GLuint* pConstantIndex, const GLuint* pConstantValue); // OpenGL core @@ -163,6 +167,8 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const G \ extCb(glDebugMessageCallback, PFNGLDEBUGMESSAGECALLBACKPROC) \ \ + extCb(glPolygonMode, PFNGLPOLYGONMODEPROC) \ + \ extCb(glMemoryBarrier, PFNGLMEMORYBARRIERPROC) \ extCb(glMemoryBarrierByRegion, PFNGLMEMORYBARRIERBYREGIONPROC) \ \ diff --git a/include/Nazara/Renderer/RenderDeviceInfo.hpp b/include/Nazara/Renderer/RenderDeviceInfo.hpp index b151ce9a5..5beb28c66 100644 --- a/include/Nazara/Renderer/RenderDeviceInfo.hpp +++ b/include/Nazara/Renderer/RenderDeviceInfo.hpp @@ -16,6 +16,7 @@ namespace Nz struct RenderDeviceFeatures { bool anisotropicFiltering = false; + bool nonSolidFaceFilling = false; }; struct RenderDeviceLimits diff --git a/src/Nazara/Graphics/Graphics.cpp b/src/Nazara/Graphics/Graphics.cpp index 4cad0114c..09208e1a3 100644 --- a/src/Nazara/Graphics/Graphics.cpp +++ b/src/Nazara/Graphics/Graphics.cpp @@ -42,6 +42,7 @@ namespace Nz RenderDeviceFeatures enabledFeatures; enabledFeatures.anisotropicFiltering = renderDeviceInfo[bestRenderDeviceIndex].features.anisotropicFiltering; + enabledFeatures.nonSolidFaceFilling = renderDeviceInfo[bestRenderDeviceIndex].features.nonSolidFaceFilling; m_renderDevice = renderer->InstanciateRenderDevice(bestRenderDeviceIndex, enabledFeatures); if (!m_renderDevice) diff --git a/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp b/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp index 2a509e63c..e65d5c9cd 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLDevice.cpp @@ -56,6 +56,9 @@ namespace Nz if ((params.type == GL::ContextType::OpenGL && glVersion >= 460) || m_referenceContext->IsExtensionSupported(GL::Extension::TextureFilterAnisotropic)) m_deviceInfo.features.anisotropicFiltering = true; + if (m_referenceContext->glPolygonMode) //< not supported in core OpenGL ES, but supported in OpenGL or with GL_NV_polygon_mode extension + m_deviceInfo.features.nonSolidFaceFilling = true; + // Limits GLint minUboOffsetAlignment; m_referenceContext->glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &minUboOffsetAlignment); diff --git a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp index e719249e1..9e07c28df 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp @@ -500,13 +500,11 @@ namespace Nz::GL m_state.renderStates.frontFace = targetFrontFace; } - /* - TODO: Use glPolyonMode if available (OpenGL) - if (m_state.renderStates.faceFilling != renderStates.faceFilling) + if (glPolygonMode && m_state.renderStates.faceFilling != renderStates.faceFilling) { - glPolygonMode(GL_FRONT_AND_BACK, FaceFilling[states.faceFilling]); + glPolygonMode(GL_FRONT_AND_BACK, ToOpenGL(renderStates.faceFilling)); m_state.renderStates.faceFilling = renderStates.faceFilling; - }*/ + } if (renderStates.stencilTest) { @@ -663,6 +661,12 @@ namespace Nz::GL return true; } + else if (function == "glPolygonMode") + { + constexpr std::size_t functionIndex = UnderlyingCast(FunctionIndex::glPolygonMode); + + return loader.Load(glPolygonMode, "glPolygonModeNV", false, false); + } return false; } diff --git a/src/Nazara/VulkanRenderer/Vulkan.cpp b/src/Nazara/VulkanRenderer/Vulkan.cpp index fdee3ba0e..cc6d9a5fa 100644 --- a/src/Nazara/VulkanRenderer/Vulkan.cpp +++ b/src/Nazara/VulkanRenderer/Vulkan.cpp @@ -54,6 +54,7 @@ namespace Nz deviceInfo.name = physDevice.properties.deviceName; deviceInfo.features.anisotropicFiltering = physDevice.features.samplerAnisotropy; + deviceInfo.features.nonSolidFaceFilling = physDevice.features.fillModeNonSolid; deviceInfo.limits.minUniformBufferOffsetAlignment = physDevice.properties.limits.minUniformBufferOffsetAlignment; @@ -274,7 +275,7 @@ namespace Nz VkValidationFeaturesEXT features = { VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT }; - std::vector enabledFeatures = { + std::array enabledFeatures = { //VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT, //VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT, VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT