diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index a486f06b7..ef71239a5 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -250,6 +250,8 @@ namespace love { currentViewportWidth = 0.0f; currentViewportHeight = 0.0f; + Vulkan::resetShaderSwitches(); + return true; } @@ -298,6 +300,10 @@ namespace love { capabilities.textureTypes[TEXTURE_CUBE] = false; } + void Graphics::getAPIStats(int& shaderswitches) const { + shaderswitches = Vulkan::getNumShaderSwitches(); + } + void Graphics::unSetMode() { created = false; vkDeviceWaitIdle(device); @@ -498,6 +504,8 @@ namespace love { Vulkan::cmdTransitionImageLayout(commandBuffers.at(imageIndex), swapChainImages[imageIndex], VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); startRenderPass(nullptr, swapChainExtent.width, swapChainExtent.height); + + Vulkan::resetShaderSwitches(); } void Graphics::endRecordingGraphicsCommands() { diff --git a/src/modules/graphics/vulkan/Graphics.h b/src/modules/graphics/vulkan/Graphics.h index e55c59ef8..833a4da8c 100644 --- a/src/modules/graphics/vulkan/Graphics.h +++ b/src/modules/graphics/vulkan/Graphics.h @@ -135,7 +135,7 @@ namespace love { graphics::StreamBuffer* newStreamBuffer(BufferUsage type, size_t size) override; bool dispatch(int x, int y, int z) override { return false; } void initCapabilities() override; - void getAPIStats(int& shaderswitches) const override { } + void getAPIStats(int& shaderswitches) const override; void setRenderTargetsInternal(const RenderTargets& rts, int pixelw, int pixelh, bool hasSRGBtexture) override; private: diff --git a/src/modules/graphics/vulkan/Shader.cpp b/src/modules/graphics/vulkan/Shader.cpp index c9ab5a8cb..17485a660 100644 --- a/src/modules/graphics/vulkan/Shader.cpp +++ b/src/modules/graphics/vulkan/Shader.cpp @@ -35,6 +35,14 @@ namespace love { } } + void Shader::attach() { + if (Shader::current != this) { + Graphics::flushBatchedDrawsGlobal(); + Shader::current = this; + Vulkan::shaderSwitch(); + } + } + int Shader::getVertexAttributeIndex(const std::string& name) { return vertexAttributeIndices.at(name); } diff --git a/src/modules/graphics/vulkan/Shader.h b/src/modules/graphics/vulkan/Shader.h index 144ce24cc..b9287e929 100644 --- a/src/modules/graphics/vulkan/Shader.h +++ b/src/modules/graphics/vulkan/Shader.h @@ -3,6 +3,7 @@ #include #include +#include "Vulkan.h" #include #include @@ -21,12 +22,7 @@ namespace love { return shaderStages; } - void attach() override { - if (Shader::current != this) { - Graphics::flushBatchedDrawsGlobal(); - Shader::current = this; - } - } + void attach() override; ptrdiff_t getHandle() const { return 0; } diff --git a/src/modules/graphics/vulkan/Vulkan.cpp b/src/modules/graphics/vulkan/Vulkan.cpp index 60165ae33..66fdfe920 100644 --- a/src/modules/graphics/vulkan/Vulkan.cpp +++ b/src/modules/graphics/vulkan/Vulkan.cpp @@ -6,6 +6,20 @@ namespace love { namespace graphics { namespace vulkan { + static uint32_t numShaderSwitches; + + void Vulkan::shaderSwitch() { + numShaderSwitches++; + } + + uint32_t Vulkan::getNumShaderSwitches() { + return numShaderSwitches; + } + + void Vulkan::resetShaderSwitches() { + numShaderSwitches = 0; + } + VkFormat Vulkan::getVulkanVertexFormat(DataFormat format) { switch (format) { case DATAFORMAT_FLOAT: diff --git a/src/modules/graphics/vulkan/Vulkan.h b/src/modules/graphics/vulkan/Vulkan.h index e4d9e9136..a4b8f010b 100644 --- a/src/modules/graphics/vulkan/Vulkan.h +++ b/src/modules/graphics/vulkan/Vulkan.h @@ -18,6 +18,10 @@ namespace love { class Vulkan { public: + static void shaderSwitch(); + static uint32_t getNumShaderSwitches(); + static void resetShaderSwitches(); + static VkFormat getVulkanVertexFormat(DataFormat format); static TextureFormat getTextureFormat(PixelFormat); static std::string getVendorName(uint32_t vendorId);