From ea0590735c2145c26b27c25aa52934b4c0851433 Mon Sep 17 00:00:00 2001 From: Matt Haynie Date: Mon, 20 May 2019 17:22:30 -0700 Subject: [PATCH] Main menu casual/competitive badge is no longer "crash the game" button --- TF2VulkanUtil/include/TF2Vulkan/Util/Macros.h | 2 +- TF2VulkanUtil/src/TF2Vulkan/Util/Macros.cpp | 2 +- .../include/TF2Vulkan/VertexFormat.h | 7 +- shaderapivulkan/shaderapivulkan.vcxproj | 12 +- .../IShaderAPI/IShaderAPI_MeshManager.cpp | 66 +++++++++ .../IShaderAPI/IShaderAPI_MeshManager.h | 39 +++++ .../IShaderAPI_StateManagerDynamic.cpp} | 17 ++- .../IShaderAPI_StateManagerDynamic.h} | 12 +- .../IShaderAPI_TextureManager.cpp} | 66 ++++----- .../IShaderAPI_TextureManager.h} | 4 +- .../TF2Vulkan/{ => IShaderAPI}/ShaderAPI.cpp | 69 +-------- shaderapivulkan/src/TF2Vulkan/LogicalState.h | 3 + .../src/TF2Vulkan/ShaderDevice.cpp | 2 +- .../src/TF2Vulkan/ShaderDeviceMgr.cpp | 2 - .../src/TF2Vulkan/StateManagerStatic.cpp | 2 +- .../src/TF2Vulkan/StateManagerVulkan.cpp | 2 +- .../src/TF2Vulkan/VertexFormat.cpp | 138 ++++++++++-------- shaderapivulkan/src/TF2Vulkan/VulkanMesh.cpp | 29 ++-- shaderapivulkan/src/TF2Vulkan/VulkanMesh.h | 8 +- .../{CBaseShader.cpp => BaseShader.cpp} | 0 stdshader_vulkan/src/shaders/BaseShaderNext.h | 10 +- .../src/shaders/DebugDrawEnvmapMask.cpp | 34 ----- stdshader_vulkan/src/shaders/DepthWrite.cpp | 36 ----- stdshader_vulkan/src/shaders/XLitGeneric.cpp | 109 +++++++++----- stdshader_vulkan/stdshader_vulkan.vcxproj | 4 +- 25 files changed, 364 insertions(+), 311 deletions(-) create mode 100644 shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.cpp create mode 100644 shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.h rename shaderapivulkan/src/TF2Vulkan/{StateManagerDynamic.cpp => IShaderAPI/IShaderAPI_StateManagerDynamic.cpp} (96%) rename shaderapivulkan/src/TF2Vulkan/{StateManagerDynamic.h => IShaderAPI/IShaderAPI_StateManagerDynamic.h} (95%) rename shaderapivulkan/src/TF2Vulkan/{IShaderTextureManager.cpp => IShaderAPI/IShaderAPI_TextureManager.cpp} (83%) rename shaderapivulkan/src/TF2Vulkan/{IShaderTextureManager.h => IShaderAPI/IShaderAPI_TextureManager.h} (97%) rename shaderapivulkan/src/TF2Vulkan/{ => IShaderAPI}/ShaderAPI.cpp (92%) rename stdshader_vulkan/src/shaders/{CBaseShader.cpp => BaseShader.cpp} (100%) delete mode 100644 stdshader_vulkan/src/shaders/DebugDrawEnvmapMask.cpp delete mode 100644 stdshader_vulkan/src/shaders/DepthWrite.cpp diff --git a/TF2VulkanUtil/include/TF2Vulkan/Util/Macros.h b/TF2VulkanUtil/include/TF2Vulkan/Util/Macros.h index 2e9a832..6e09ca0 100644 --- a/TF2VulkanUtil/include/TF2Vulkan/Util/Macros.h +++ b/TF2VulkanUtil/include/TF2Vulkan/Util/Macros.h @@ -46,7 +46,7 @@ namespace Util //#define TF2VULKAN_ENABLE_FUNCTION_LOGGING 1 #if defined(TF2VULKAN_ENABLE_FUNCTION_LOGGING) -#define LOG_FUNC_MSG(msg) ::Util::LogFunctionCallScope EXPAND_CONCAT(_TF2Vulkan_LogFunctionCallScope_, __LINE__) (__FUNCSIG__, __FILE__, __LINE__, msg) +#define LOG_FUNC_MSG(msg) ::Util::LogFunctionCallScope EXPAND_CONCAT(_TF2Vulkan_LogFunctionCallScope_, __COUNTER__) (__FUNCSIG__, __FILE__, __LINE__, msg) #else #define LOG_FUNC_MSG(msg) { ASSERT_MAIN_THREAD(); } #endif diff --git a/TF2VulkanUtil/src/TF2Vulkan/Util/Macros.cpp b/TF2VulkanUtil/src/TF2Vulkan/Util/Macros.cpp index d0115f1..23313fd 100644 --- a/TF2VulkanUtil/src/TF2Vulkan/Util/Macros.cpp +++ b/TF2VulkanUtil/src/TF2Vulkan/Util/Macros.cpp @@ -54,7 +54,7 @@ void Util::EnsureConditionFailed(const char* condition, const char* fnSig, const void Util::FunctionNotImplemented(const char* fnSig, const char* file, int line) { - Warning("[TF2Vulkan] %s in %s:%i not implemented\n", fnSig, file, line); + Warning("[TF2Vulkan] NOT IMPLEMENTED: %s in %s:%i\n", fnSig, file, line); } static thread_local int s_LogFunctionCallIndentation = 0; diff --git a/shaderapivulkan/include/TF2Vulkan/VertexFormat.h b/shaderapivulkan/include/TF2Vulkan/VertexFormat.h index b30db5e..eddce07 100644 --- a/shaderapivulkan/include/TF2Vulkan/VertexFormat.h +++ b/shaderapivulkan/include/TF2Vulkan/VertexFormat.h @@ -29,6 +29,7 @@ namespace TF2Vulkan Meta_VertexShader = VERTEX_FORMAT_VERTEX_SHADER, Meta_UseExactFormat = VERTEX_FORMAT_USE_EXACT_FORMAT, Meta_Compressed = VERTEX_FORMAT_COMPRESSED, + Meta_Unknown = VERTEX_FORMAT_UNKNOWN, }; union VertexFormat @@ -60,6 +61,8 @@ namespace TF2Vulkan void SetTexCoordSize(uint_fast8_t index, uint_fast8_t size); VertexCompressionType_t GetCompressionType() const; + constexpr bool IsUnknownFormat() const { return m_Flags == VertexFormatFlags::Meta_Unknown; } + void SetCompressionEnabled(bool enabled); struct ElementType final @@ -82,8 +85,8 @@ namespace TF2Vulkan struct Element { - const ElementType* m_Type = nullptr; - uint_fast8_t m_Offset = 0; + const ElementType* m_Type;// = nullptr; + uint_fast8_t m_Offset;// = 0; }; [[nodiscard]] uint_fast8_t GetVertexElements(Element* elements, uint_fast8_t maxElements, size_t* totalSize = nullptr) const; diff --git a/shaderapivulkan/shaderapivulkan.vcxproj b/shaderapivulkan/shaderapivulkan.vcxproj index a5e79a9..60551db 100644 --- a/shaderapivulkan/shaderapivulkan.vcxproj +++ b/shaderapivulkan/shaderapivulkan.vcxproj @@ -113,7 +113,8 @@ - + + @@ -129,7 +130,7 @@ - + @@ -157,10 +158,11 @@ - + + - + @@ -171,7 +173,7 @@ - + diff --git a/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.cpp b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.cpp new file mode 100644 index 0000000..d7dbdcd --- /dev/null +++ b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.cpp @@ -0,0 +1,66 @@ +#include "IShaderAPI_MeshManager.h" + +#include + +using namespace TF2Vulkan; + +int IShaderAPI_MeshManager::GetMaxVerticesToRender(IMaterial* material) +{ + LOG_FUNC(); + + VertexFormat fmt(material->GetVertexFormat()); + fmt.RemoveFlags(VertexFormatFlags::Meta_Compressed); + + const auto vtxSize = fmt.GetVertexSize(); + const auto currentDynamicVBSize = GetCurrentDynamicVBSize(); + + if (vtxSize < 1) + { + Warning(TF2VULKAN_PREFIX "Invalid vertex size %i for material %s (%s)\n", + vtxSize, material->GetName(), material->GetShaderName()); + return currentDynamicVBSize; + } + + return currentDynamicVBSize / vtxSize; +} + +int IShaderAPI_MeshManager::GetMaxIndicesToRender() +{ + LOG_FUNC(); + + // Technically we're "unlimited" (constrained by (v)ram only) + return INDEX_BUFFER_SIZE; +} + +int IShaderAPI_MeshManager::GetCurrentDynamicVBSize() +{ + LOG_FUNC(); + // Technically we're "unlimited" (constrained by (v)ram only) + return DYNAMIC_VERTEX_BUFFER_MEMORY; +} + +IMesh* IShaderAPI_MeshManager::GetDynamicMesh(IMaterial* material, int hwSkinBoneCount, + bool buffered, IMesh* vertexOverride, IMesh* indexOverride) +{ + LOG_FUNC(); + return GetDynamicMeshEx(material, material->GetVertexFormat(), hwSkinBoneCount, buffered, vertexOverride, indexOverride); +} + +IMesh* IShaderAPI_MeshManager::GetDynamicMeshEx(IMaterial* material, VertexFormat_t vertexFormat, + int hwSkinBoneCount, bool buffered, IMesh* vertexOverride, IMesh* indexOverride) +{ + LOG_FUNC(); + + const VertexFormat fmt(vertexFormat); + assert(hwSkinBoneCount == 0); + assert(fmt.m_BoneWeightCount == 0); + assert(!(fmt.m_Flags & VertexFormatFlags::BoneIndex)); + + return &m_DynamicMeshes.try_emplace(fmt, fmt, true).first->second; +} + +CMeshBuilder* IShaderAPI_MeshManager::GetVertexModifyBuilder() +{ + LOG_FUNC(); + return &m_MeshBuilder; +} diff --git a/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.h b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.h new file mode 100644 index 0000000..927630f --- /dev/null +++ b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_MeshManager.h @@ -0,0 +1,39 @@ +#pragma once + +#include "IShaderAPI_TextureManager.h" +#include "TF2Vulkan/VertexFormat.h" +#include "TF2Vulkan/VulkanMesh.h" + +namespace TF2Vulkan +{ + class IShaderAPI_MeshManager : public IShaderAPI_TextureManager + { + public: + void GetMaxToRender(IMesh* mesh, bool maxUntilFlush, int* maxVerts, int* maxIndices) override final { NOT_IMPLEMENTED_FUNC(); } + + int GetMaxVerticesToRender(IMaterial* material) override final; + int GetMaxIndicesToRender() override final; + + IMesh* GetFlexMesh() override final { NOT_IMPLEMENTED_FUNC(); } + + int GetCurrentDynamicVBSize() override final; + void DestroyVertexBuffers(bool exitingLevel) override final { NOT_IMPLEMENTED_FUNC(); } + + CMeshBuilder* GetVertexModifyBuilder() override final; + IMesh* GetDynamicMesh(IMaterial* material, int hwSkinBoneCount, bool buffered, + IMesh* vertexOverride, IMesh* indexOverride) override final; + IMesh* GetDynamicMeshEx(IMaterial* material, VertexFormat_t vertexFormat, int hwSkinBoneCount, + bool buffered, IMesh* vertexOverride, IMesh* indexOverride) override final; + + const ActiveMeshData& GetActiveMesh() override final { return m_ActiveMesh.top(); } + void PushActiveMesh(const ActiveMeshData& mesh) override final { m_ActiveMesh.push(mesh); } + void PopActiveMesh() override final { m_ActiveMesh.pop(); } + + private: + std::unordered_map m_DynamicMeshes; + + CMeshBuilder m_MeshBuilder; + + std::stack> m_ActiveMesh; + }; +} diff --git a/shaderapivulkan/src/TF2Vulkan/StateManagerDynamic.cpp b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_StateManagerDynamic.cpp similarity index 96% rename from shaderapivulkan/src/TF2Vulkan/StateManagerDynamic.cpp rename to shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_StateManagerDynamic.cpp index 61c45da..2200e6a 100644 --- a/shaderapivulkan/src/TF2Vulkan/StateManagerDynamic.cpp +++ b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_StateManagerDynamic.cpp @@ -1,9 +1,9 @@ #include "stdafx.h" -#include "StateManagerDynamic.h" +#include "IShaderAPI_StateManagerDynamic.h" #include "interface/IMaterialInternal.h" #include "interface/internal/IShaderInternal.h" #include "interface/internal/IStateManagerStatic.h" -#include "shaders/VulkanShaderManager.h" +#include "TF2Vulkan/shaders/VulkanShaderManager.h" #include #include @@ -193,8 +193,21 @@ const Vector& IShaderAPI_StateManagerDynamic::GetToneMappingScaleLinear() const return m_State.m_TonemappingScale; } +void IShaderAPI_StateManagerDynamic::EnableUserClipTransformOverride(bool enable) +{ + LOG_FUNC(); + Util::SetDirtyVar(m_State.m_UserClipTransformOverrideEnabled, enable, m_Dirty); +} + +void IShaderAPI_StateManagerDynamic::UserClipTransform(const VMatrix& worldToView) +{ + LOG_FUNC(); + Util::SetDirtyVar(m_State.m_UserClipTransformOverride, worldToView, m_Dirty); +} + void IShaderAPI_StateManagerDynamic::SetShaderInstance(ShaderType type, const IShaderInstance* instance) { + assert(instance->GetGroup().GetShaderType() == type); switch (type) { case ShaderType::Pixel: diff --git a/shaderapivulkan/src/TF2Vulkan/StateManagerDynamic.h b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_StateManagerDynamic.h similarity index 95% rename from shaderapivulkan/src/TF2Vulkan/StateManagerDynamic.h rename to shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_StateManagerDynamic.h index 9ab3b3a..9f1df90 100644 --- a/shaderapivulkan/src/TF2Vulkan/StateManagerDynamic.h +++ b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_StateManagerDynamic.h @@ -1,7 +1,7 @@ #pragma once -#include "LogicalState.h" -#include "IShaderTextureManager.h" +#include "TF2Vulkan/LogicalState.h" +#include "IShaderAPI_MeshManager.h" #include #include @@ -14,9 +14,9 @@ namespace TF2Vulkan { - class IShaderAPI_StateManagerDynamic : public IShaderTextureManager, public IShaderDynamicNext + class IShaderAPI_StateManagerDynamic : public IShaderAPI_MeshManager, public IShaderDynamicNext { - using BaseClass = IShaderTextureManager; + using BaseClass = IShaderAPI_TextureManager; public: IShaderAPI_StateManagerDynamic(); @@ -135,6 +135,9 @@ namespace TF2Vulkan const Vector& GetToneMappingScaleLinear(void) const override final; float GetLightMapScaleFactor(void) const override final { NOT_IMPLEMENTED_FUNC(); } + void EnableUserClipTransformOverride(bool enable) override final; + void UserClipTransform(const VMatrix& worldToView) override final; + // IShaderDynamicNext void SetShaderInstance(ShaderType type, const IShaderInstance* instance) override final; void BindUniformBuffer(const BufferPoolEntry& buf, UniformBufferIndex index) override final; @@ -145,7 +148,6 @@ namespace TF2Vulkan const LogicalDynamicState& GetDynamicState() const { return m_State; } private: - MaterialMatrixMode_t m_MatrixMode = {}; using MatrixStack = std::stack>; std::array m_MatrixStacks; diff --git a/shaderapivulkan/src/TF2Vulkan/IShaderTextureManager.cpp b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_TextureManager.cpp similarity index 83% rename from shaderapivulkan/src/TF2Vulkan/IShaderTextureManager.cpp rename to shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_TextureManager.cpp index 3ca7c55..93867d4 100644 --- a/shaderapivulkan/src/TF2Vulkan/IShaderTextureManager.cpp +++ b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_TextureManager.cpp @@ -1,8 +1,8 @@ -#include "IShaderTextureManager.h" -#include "FormatInfo.h" -#include "VulkanFactories.h" +#include "IShaderAPI_TextureManager.h" +#include "TF2Vulkan/FormatInfo.h" +#include "TF2Vulkan/VulkanFactories.h" #include "TF2Vulkan/TextureData.h" -#include "FormatConverter.h" +#include "TF2Vulkan/FormatConverter.h" #include @@ -17,7 +17,7 @@ using namespace TF2Vulkan; -const IShaderAPITexture* IShaderTextureManager::TryGetTexture(ShaderAPITextureHandle_t texID) const +const IShaderAPITexture* IShaderAPI_TextureManager::TryGetTexture(ShaderAPITextureHandle_t texID) const { if (auto found = m_Textures.find(texID); found != m_Textures.end()) return &found->second; @@ -25,7 +25,7 @@ const IShaderAPITexture* IShaderTextureManager::TryGetTexture(ShaderAPITextureHa return nullptr; } -const IShaderAPITexture& IShaderTextureManager::TryGetTexture(ShaderAPITextureHandle_t texID, StandardTextureId_t fallbackID) const +const IShaderAPITexture& IShaderAPI_TextureManager::TryGetTexture(ShaderAPITextureHandle_t texID, StandardTextureId_t fallbackID) const { if (auto found = TryGetTexture(texID)) return *found; @@ -33,17 +33,17 @@ const IShaderAPITexture& IShaderTextureManager::TryGetTexture(ShaderAPITextureHa return GetTexture(m_StdTextures.at(fallbackID)); } -IShaderAPITexture* IShaderTextureManager::TryGetTexture(ShaderAPITextureHandle_t texID) +IShaderAPITexture* IShaderAPI_TextureManager::TryGetTexture(ShaderAPITextureHandle_t texID) { return const_cast(std::as_const(*this).TryGetTexture(texID)); } -IShaderAPITexture& IShaderTextureManager::TryGetTexture(ShaderAPITextureHandle_t texID, StandardTextureId_t fallbackID) +IShaderAPITexture& IShaderAPI_TextureManager::TryGetTexture(ShaderAPITextureHandle_t texID, StandardTextureId_t fallbackID) { return const_cast(std::as_const(*this).TryGetTexture(texID, fallbackID)); } -const IShaderAPITexture& IShaderTextureManager::GetTexture(ShaderAPITextureHandle_t texID) const +const IShaderAPITexture& IShaderAPI_TextureManager::GetTexture(ShaderAPITextureHandle_t texID) const { auto found = TryGetTexture(texID); if (!found) @@ -52,31 +52,31 @@ const IShaderAPITexture& IShaderTextureManager::GetTexture(ShaderAPITextureHandl return *found; } -IShaderAPITexture& IShaderTextureManager::GetTexture(ShaderAPITextureHandle_t texID) +IShaderAPITexture& IShaderAPI_TextureManager::GetTexture(ShaderAPITextureHandle_t texID) { return const_cast(std::as_const(*this).GetTexture(texID)); } -ShaderAPITextureHandle_t IShaderTextureManager::GetStdTextureHandle(StandardTextureId_t stdTex) const +ShaderAPITextureHandle_t IShaderAPI_TextureManager::GetStdTextureHandle(StandardTextureId_t stdTex) const { return m_StdTextures.at(stdTex); } -void IShaderTextureManager::TexMinFilter(ShaderAPITextureHandle_t texHandle, ShaderTexFilterMode_t mode) +void IShaderAPI_TextureManager::TexMinFilter(ShaderAPITextureHandle_t texHandle, ShaderTexFilterMode_t mode) { LOG_FUNC(); auto& tex = m_Textures.at(texHandle); tex.m_SamplerSettings.m_MinFilter = mode; } -void IShaderTextureManager::TexMagFilter(ShaderAPITextureHandle_t texHandle, ShaderTexFilterMode_t mode) +void IShaderAPI_TextureManager::TexMagFilter(ShaderAPITextureHandle_t texHandle, ShaderTexFilterMode_t mode) { LOG_FUNC(); auto& tex = m_Textures.at(texHandle); tex.m_SamplerSettings.m_MagFilter = mode; } -IShaderAPITexture& IShaderTextureManager::CreateTexture(std::string&& dbgName, const vk::ImageCreateInfo& imgCI) +IShaderAPITexture& IShaderAPI_TextureManager::CreateTexture(std::string&& dbgName, const vk::ImageCreateInfo& imgCI) { const auto handle = m_NextTextureHandle++; LOG_FUNC_TEX_NAME(handle, dbgName); @@ -92,7 +92,7 @@ IShaderAPITexture& IShaderTextureManager::CreateTexture(std::string&& dbgName, c return m_Textures.emplace(handle, ShaderTexture{ std::move(dbgName), handle, imgCI, std::move(createdImg) }).first->second; } -ShaderAPITextureHandle_t IShaderTextureManager::CreateTexture(int width, int height, int depth, +ShaderAPITextureHandle_t IShaderAPI_TextureManager::CreateTexture(int width, int height, int depth, ImageFormat dstImgFormat, int mipLevelCount, int copyCount, CreateTextureFlags_t flags, const char* dbgName, const char* texGroupName) { @@ -171,7 +171,7 @@ ShaderAPITextureHandle_t IShaderTextureManager::CreateTexture(int width, int hei return newTex.GetHandle(); } -void IShaderTextureManager::CreateTextures(ShaderAPITextureHandle_t * handles, int count, +void IShaderAPI_TextureManager::CreateTextures(ShaderAPITextureHandle_t * handles, int count, int width, int height, int depth, ImageFormat dstImgFormat, int mipLevelCount, int copyCount, CreateTextureFlags_t flags, const char* dbgName, const char* texGroupName) { @@ -184,7 +184,7 @@ void IShaderTextureManager::CreateTextures(ShaderAPITextureHandle_t * handles, i } } -void IShaderTextureManager::TexWrap(ShaderAPITextureHandle_t texHandle, ShaderTexCoordComponent_t coord, ShaderTexWrapMode_t wrapMode) +void IShaderAPI_TextureManager::TexWrap(ShaderAPITextureHandle_t texHandle, ShaderTexCoordComponent_t coord, ShaderTexWrapMode_t wrapMode) { LOG_FUNC(); auto& tex = m_Textures.at(texHandle); @@ -207,7 +207,7 @@ void IShaderTextureManager::TexWrap(ShaderAPITextureHandle_t texHandle, ShaderTe } } -ShaderAPITextureHandle_t IShaderTextureManager::CreateDepthTexture(ImageFormat rtFormat, int width, int height, +ShaderAPITextureHandle_t IShaderAPI_TextureManager::CreateDepthTexture(ImageFormat rtFormat, int width, int height, const char* dbgName, bool texture) { LOG_FUNC(); @@ -216,7 +216,7 @@ ShaderAPITextureHandle_t IShaderTextureManager::CreateDepthTexture(ImageFormat r return CreateTexture(width, height, 1, IMAGE_FORMAT_NV_DST24, 1, 0, TEXTURE_CREATE_DEPTHBUFFER, dbgName, TEXTURE_GROUP_RENDER_TARGET); } -void IShaderTextureManager::DeleteTexture(ShaderAPITextureHandle_t tex) +void IShaderAPI_TextureManager::DeleteTexture(ShaderAPITextureHandle_t tex) { LOG_FUNC_TEX(tex); @@ -255,7 +255,7 @@ void IShaderTextureManager::DeleteTexture(ShaderAPITextureHandle_t tex) m_Textures.erase(tex); } -bool IShaderTextureManager::IsTexture(ShaderAPITextureHandle_t tex) +bool IShaderAPI_TextureManager::IsTexture(ShaderAPITextureHandle_t tex) { LOG_FUNC_TEX(tex); @@ -264,7 +264,7 @@ bool IShaderTextureManager::IsTexture(ShaderAPITextureHandle_t tex) return found; } -void IShaderTextureManager::TexImageFromVTF(ShaderAPITextureHandle_t texHandle, IVTFTexture* vtf, int frameIndex) +void IShaderAPI_TextureManager::TexImageFromVTF(ShaderAPITextureHandle_t texHandle, IVTFTexture* vtf, int frameIndex) { LOG_FUNC_TEX(texHandle); @@ -320,7 +320,7 @@ void IShaderTextureManager::TexImageFromVTF(ShaderAPITextureHandle_t texHandle, UpdateTexture(texHandle, texDatas, arraySize); } -bool IShaderTextureManager::UpdateTexture(ShaderAPITextureHandle_t texHandle, const TextureData* data, size_t count) +bool IShaderAPI_TextureManager::UpdateTexture(ShaderAPITextureHandle_t texHandle, const TextureData* data, size_t count) { LOG_FUNC_TEX(texHandle); @@ -500,13 +500,13 @@ bool IShaderTextureManager::UpdateTexture(ShaderAPITextureHandle_t texHandle, co return true; } -void IShaderTextureManager::SetStandardTextureHandle(StandardTextureId_t id, ShaderAPITextureHandle_t tex) +void IShaderAPI_TextureManager::SetStandardTextureHandle(StandardTextureId_t id, ShaderAPITextureHandle_t tex) { LOG_FUNC(); m_StdTextures.at(id) = tex; } -void IShaderTextureManager::TexLodClamp(int something) +void IShaderAPI_TextureManager::TexLodClamp(int something) { LOG_FUNC(); @@ -514,7 +514,7 @@ void IShaderTextureManager::TexLodClamp(int something) NOT_IMPLEMENTED_FUNC(); } -void IShaderTextureManager::TexLodBias(float bias) +void IShaderAPI_TextureManager::TexLodBias(float bias) { LOG_FUNC(); @@ -522,7 +522,7 @@ void IShaderTextureManager::TexLodBias(float bias) NOT_IMPLEMENTED_FUNC(); } -void IShaderTextureManager::GetStandardTextureDimensions(int* width, int* height, StandardTextureId_t id) +void IShaderAPI_TextureManager::GetStandardTextureDimensions(int* width, int* height, StandardTextureId_t id) { LOG_FUNC(); @@ -536,13 +536,13 @@ void IShaderTextureManager::GetStandardTextureDimensions(int* width, int* height Util::SafeConvert(ci.extent.height, *height); } -void IShaderTextureManager::ModifyTexture(ShaderAPITextureHandle_t tex) +void IShaderAPI_TextureManager::ModifyTexture(ShaderAPITextureHandle_t tex) { LOG_FUNC(); m_ModifyTexture = tex; } -void IShaderTextureManager::TexImage2D(int level, int cubeFaceID, ImageFormat dstFormat, +void IShaderAPI_TextureManager::TexImage2D(int level, int cubeFaceID, ImageFormat dstFormat, int zOffset, int width, int height, ImageFormat srcFormat, bool srcIsTiled, void* imgData) { LOG_FUNC(); @@ -559,7 +559,7 @@ void IShaderTextureManager::TexImage2D(int level, int cubeFaceID, ImageFormat ds imgData); } -void IShaderTextureManager::TexSubImage2D(int level, int cubeFaceID, int xOffset, int yOffset, +void IShaderAPI_TextureManager::TexSubImage2D(int level, int cubeFaceID, int xOffset, int yOffset, int zOffset, int width, int height, ImageFormat srcFormat, int srcStride, bool srcIsTiled, void* imgData) { LOG_FUNC(); @@ -584,25 +584,25 @@ void IShaderTextureManager::TexSubImage2D(int level, int cubeFaceID, int xOffset UpdateTexture(m_ModifyTexture, &data, 1); } -void IShaderTextureManager::TexImageFromVTF(IVTFTexture* vtf, int frameIndex) +void IShaderAPI_TextureManager::TexImageFromVTF(IVTFTexture* vtf, int frameIndex) { LOG_FUNC(); return TexImageFromVTF(m_ModifyTexture, vtf, frameIndex); } -void IShaderTextureManager::TexMinFilter(ShaderTexFilterMode_t mode) +void IShaderAPI_TextureManager::TexMinFilter(ShaderTexFilterMode_t mode) { LOG_FUNC(); return TexMinFilter(m_ModifyTexture, mode); } -void IShaderTextureManager::TexMagFilter(ShaderTexFilterMode_t mode) +void IShaderAPI_TextureManager::TexMagFilter(ShaderTexFilterMode_t mode) { LOG_FUNC(); return TexMagFilter(m_ModifyTexture, mode); } -void IShaderTextureManager::TexWrap(ShaderTexCoordComponent_t coord, ShaderTexWrapMode_t wrapMode) +void IShaderAPI_TextureManager::TexWrap(ShaderTexCoordComponent_t coord, ShaderTexWrapMode_t wrapMode) { LOG_FUNC(); return TexWrap(m_ModifyTexture, coord, wrapMode); diff --git a/shaderapivulkan/src/TF2Vulkan/IShaderTextureManager.h b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_TextureManager.h similarity index 97% rename from shaderapivulkan/src/TF2Vulkan/IShaderTextureManager.h rename to shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_TextureManager.h index 683246f..1bce52e 100644 --- a/shaderapivulkan/src/TF2Vulkan/IShaderTextureManager.h +++ b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/IShaderAPI_TextureManager.h @@ -9,7 +9,7 @@ namespace TF2Vulkan { - class IShaderTextureManager : public IShaderAPIInternal + class IShaderAPI_TextureManager : public IShaderAPIInternal { public: const IShaderAPITexture* TryGetTexture(ShaderAPITextureHandle_t texID) const; @@ -87,5 +87,5 @@ namespace TF2Vulkan void TexLodBias(float bias) override final; }; - extern IShaderTextureManager& g_TextureManager; + extern IShaderAPI_TextureManager& g_TextureManager; } diff --git a/shaderapivulkan/src/TF2Vulkan/ShaderAPI.cpp b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/ShaderAPI.cpp similarity index 92% rename from shaderapivulkan/src/TF2Vulkan/ShaderAPI.cpp rename to shaderapivulkan/src/TF2Vulkan/IShaderAPI/ShaderAPI.cpp index b8a3e97..5cd8409 100644 --- a/shaderapivulkan/src/TF2Vulkan/ShaderAPI.cpp +++ b/shaderapivulkan/src/TF2Vulkan/IShaderAPI/ShaderAPI.cpp @@ -1,12 +1,12 @@ -#include "FormatInfo.h" -#include "StateManagerDynamic.h" -#include "SamplerSettings.h" +#include "TF2Vulkan/FormatInfo.h" +#include "IShaderAPI_StateManagerDynamic.h" +#include "TF2Vulkan/SamplerSettings.h" #include "interface/internal/IShaderDeviceInternal.h" #include "interface/internal/IStateManagerStatic.h" #include "TF2Vulkan/TextureData.h" -#include "VulkanFactories.h" -#include "VulkanMesh.h" -#include "VulkanUtil.h" +#include "TF2Vulkan/VulkanFactories.h" +#include "TF2Vulkan/VulkanMesh.h" +#include "TF2Vulkan/VulkanUtil.h" #include #include @@ -47,7 +47,6 @@ namespace void SetVertexShaderStateAmbientLightCube() override; - CMeshBuilder* GetVertexModifyBuilder() override; bool InEditorMode() const override; MorphFormat_t GetBoundMorphFormat() override { NOT_IMPLEMENTED_FUNC(); } @@ -78,11 +77,6 @@ namespace void FlushBufferedPrimitives() override; - IMesh* GetDynamicMesh(IMaterial* material, int hwSkinBoneCount, bool buffered, - IMesh* vertexOverride, IMesh* indexOverride) override; - IMesh* GetDynamicMeshEx(IMaterial* material, VertexFormat_t vertexFormat, int hwSkinBoneCount, - bool buffered, IMesh* vertexOverride, IMesh* indexOverride) override; - bool IsTranslucent(StateSnapshot_t id) const override; bool IsAlphaTested(StateSnapshot_t id) const override; bool UsesVertexAndPixelShaders(StateSnapshot_t id) const override; @@ -147,9 +141,6 @@ namespace void ResetRenderState(bool fullReset) override; - int GetCurrentDynamicVBSize() override { NOT_IMPLEMENTED_FUNC(); } - void DestroyVertexBuffers(bool exitingLevel) override { NOT_IMPLEMENTED_FUNC(); } - void EvictManagedResources() override; void SyncToken(const char* token) override { NOT_IMPLEMENTED_FUNC(); } @@ -174,9 +165,6 @@ namespace void DXSupportLevelChanged() override; - void EnableUserClipTransformOverride(bool enable) override { NOT_IMPLEMENTED_FUNC(); } - void UserClipTransform(const VMatrix& worldToView) override { NOT_IMPLEMENTED_FUNC(); } - MorphFormat_t ComputeMorphFormat(int snapshots, StateSnapshot_t* ids) const override; void HandleDeviceLost() override { NOT_IMPLEMENTED_FUNC(); } @@ -184,18 +172,11 @@ namespace void SetFastClipPlane(const float* plane) override { NOT_IMPLEMENTED_FUNC(); } void EnableFastClip(bool enable) override { NOT_IMPLEMENTED_FUNC(); } - void GetMaxToRender(IMesh* mesh, bool maxUntilFlush, int* maxVerts, int* maxIndices) override { NOT_IMPLEMENTED_FUNC(); } - - int GetMaxVerticesToRender(IMaterial* material) override { NOT_IMPLEMENTED_FUNC(); } - int GetMaxIndicesToRender() override { NOT_IMPLEMENTED_FUNC(); } - void ClearStencilBufferRectangle(int xmin, int ymin, int xmax, int ymax, int value) override { NOT_IMPLEMENTED_FUNC(); } void DisableAllLocalLights() override { NOT_IMPLEMENTED_FUNC(); } int CompareSnapshots(StateSnapshot_t lhs, StateSnapshot_t rhs) override { NOT_IMPLEMENTED_FUNC(); } - IMesh* GetFlexMesh() override { NOT_IMPLEMENTED_FUNC(); } - bool SupportsMSAAMode(int msaaMode) override { NOT_IMPLEMENTED_FUNC(); } bool OwnGPUResources(bool enable) override { NOT_IMPLEMENTED_FUNC(); } @@ -299,19 +280,9 @@ namespace void CopyTextureToTexture(int something1, int something2) override { NOT_IMPLEMENTED_FUNC(); } - const ActiveMeshData& GetActiveMesh() override { return m_ActiveMesh.top(); } - void PushActiveMesh(const ActiveMeshData& mesh) override { m_ActiveMesh.push(mesh); } - void PopActiveMesh() override { m_ActiveMesh.pop(); } - private: mutable std::recursive_mutex m_ShaderLock; - std::unordered_map m_DynamicMeshes; - - CMeshBuilder m_MeshBuilder; - - std::stack> m_ActiveMesh; - bool m_IsInFrame = false; ShaderAPITextureHandle_t m_L2GConvTex_SRGBWriteEnabled = INVALID_SHADERAPI_TEXTURE_HANDLE; ShaderAPITextureHandle_t m_L2GConvTex_Identity = INVALID_SHADERAPI_TEXTURE_HANDLE; @@ -325,7 +296,7 @@ EXPOSE_SINGLE_INTERFACE_GLOBALVAR(ShaderAPI, IShaderDynamicNext, SHADERDYNAMICNE IShaderAPI_StateManagerDynamic& TF2Vulkan::g_StateManagerDynamic = s_ShaderAPI; IShaderAPIInternal& TF2Vulkan::g_ShaderAPIInternal = s_ShaderAPI; -IShaderTextureManager& TF2Vulkan::g_TextureManager = s_ShaderAPI; +IShaderAPI_TextureManager& TF2Vulkan::g_TextureManager = s_ShaderAPI; void ShaderAPI::ClearBuffers(bool clearColor, bool clearDepth, bool clearStencil, int rtWidth, int rtHeight) { @@ -416,26 +387,6 @@ void ShaderAPI::SetPIXMarker(const Color& color, const char* name) g_ShaderDevice.GetPrimaryCmdBuf().InsertDebugLabel(color, name); } -IMesh* ShaderAPI::GetDynamicMesh(IMaterial* material, int hwSkinBoneCount, - bool buffered, IMesh* vertexOverride, IMesh* indexOverride) -{ - LOG_FUNC(); - return GetDynamicMeshEx(material, material->GetVertexFormat(), hwSkinBoneCount, buffered, vertexOverride, indexOverride); -} - -IMesh* ShaderAPI::GetDynamicMeshEx(IMaterial* material, VertexFormat_t vertexFormat, - int hwSkinBoneCount, bool buffered, IMesh* vertexOverride, IMesh* indexOverride) -{ - LOG_FUNC(); - - const VertexFormat fmt(vertexFormat); - assert(hwSkinBoneCount == 0); - assert(fmt.m_BoneWeightCount == 0); - assert(!(fmt.m_Flags & VertexFormatFlags::BoneIndex)); - - return &m_DynamicMeshes.try_emplace(fmt, fmt, true).first->second; -} - bool ShaderAPI::IsTranslucent(StateSnapshot_t id) const { LOG_FUNC(); @@ -679,12 +630,6 @@ void ShaderAPI::BeginPass(StateSnapshot_t snapshot) g_StateManagerStatic.SetState(snapshot); } -CMeshBuilder* ShaderAPI::GetVertexModifyBuilder() -{ - LOG_FUNC(); - return &m_MeshBuilder; -} - void ShaderAPI::RenderPass(int passID, int passCount) { LOG_FUNC(); diff --git a/shaderapivulkan/src/TF2Vulkan/LogicalState.h b/shaderapivulkan/src/TF2Vulkan/LogicalState.h index 04c9c40..fae74a2 100644 --- a/shaderapivulkan/src/TF2Vulkan/LogicalState.h +++ b/shaderapivulkan/src/TF2Vulkan/LogicalState.h @@ -71,6 +71,9 @@ namespace TF2Vulkan std::array m_RenderParamsFloat; std::array m_BoundTextures{}; + + bool m_UserClipTransformOverrideEnabled = false; + VMatrix m_UserClipTransformOverride{}; }; struct LogicalShadowState final diff --git a/shaderapivulkan/src/TF2Vulkan/ShaderDevice.cpp b/shaderapivulkan/src/TF2Vulkan/ShaderDevice.cpp index a838ad1..233557b 100644 --- a/shaderapivulkan/src/TF2Vulkan/ShaderDevice.cpp +++ b/shaderapivulkan/src/TF2Vulkan/ShaderDevice.cpp @@ -2,7 +2,7 @@ #include "FormatInfo.h" #include "interface/internal/IShaderAPIInternal.h" #include "interface/internal/IShaderAPITexture.h" -#include "IShaderTextureManager.h" +#include "IShaderAPI/IShaderAPI_TextureManager.h" #include "interface/internal/IShaderDeviceInternal.h" #include "interface/internal/IShaderDeviceMgrInternal.h" #include "VulkanCommandBufferBase.h" diff --git a/shaderapivulkan/src/TF2Vulkan/ShaderDeviceMgr.cpp b/shaderapivulkan/src/TF2Vulkan/ShaderDeviceMgr.cpp index 3db8598..ee2fa93 100644 --- a/shaderapivulkan/src/TF2Vulkan/ShaderDeviceMgr.cpp +++ b/shaderapivulkan/src/TF2Vulkan/ShaderDeviceMgr.cpp @@ -122,8 +122,6 @@ bool ShaderDeviceMgr::Connect(CreateInterfaceFn factory) ConVar_Register(); - //auto test = factory("MatSystemSurface008", nullptr); - if (!CommandLine()->CheckParm("-insecure")) { Error("TF2Vulkan is likely to trigger VAC. For this reason, you MUST use -insecure" diff --git a/shaderapivulkan/src/TF2Vulkan/StateManagerStatic.cpp b/shaderapivulkan/src/TF2Vulkan/StateManagerStatic.cpp index e69b122..7baf11f 100644 --- a/shaderapivulkan/src/TF2Vulkan/StateManagerStatic.cpp +++ b/shaderapivulkan/src/TF2Vulkan/StateManagerStatic.cpp @@ -1,6 +1,6 @@ #include "interface/internal/IStateManagerStatic.h" #include "interface/internal/IShaderInternal.h" -#include "StateManagerDynamic.h" +#include "IShaderAPI/IShaderAPI_StateManagerDynamic.h" #include "IStateManagerVulkan.h" #include "shaders/VulkanShaderManager.h" diff --git a/shaderapivulkan/src/TF2Vulkan/StateManagerVulkan.cpp b/shaderapivulkan/src/TF2Vulkan/StateManagerVulkan.cpp index 53c53c7..2fc974d 100644 --- a/shaderapivulkan/src/TF2Vulkan/StateManagerVulkan.cpp +++ b/shaderapivulkan/src/TF2Vulkan/StateManagerVulkan.cpp @@ -1,5 +1,5 @@ #include "interface/internal/IShaderAPIInternal.h" -#include "IShaderTextureManager.h" +#include "IShaderAPI/IShaderAPI_TextureManager.h" #include "IStateManagerVulkan.h" #include "LogicalState.h" #include "MaterialSystemHardwareConfig.h" diff --git a/shaderapivulkan/src/TF2Vulkan/VertexFormat.cpp b/shaderapivulkan/src/TF2Vulkan/VertexFormat.cpp index 27f67b2..749a922 100644 --- a/shaderapivulkan/src/TF2Vulkan/VertexFormat.cpp +++ b/shaderapivulkan/src/TF2Vulkan/VertexFormat.cpp @@ -120,16 +120,6 @@ namespace } #endif -size_t VertexFormat::GetVertexSize() const -{ - using VFF = VertexFormatFlags; - size_t size = 0; - - NOT_IMPLEMENTED_FUNC(); - - return size; -} - VertexCompressionType_t VertexFormat::GetCompressionType() const { if (m_Flags & VertexFormatFlags::Meta_Compressed) @@ -146,11 +136,84 @@ void VertexFormat::SetCompressionEnabled(bool enabled) m_Flags = m_Flags & ~VertexFormatFlags::Meta_Compressed; } +template +static void ForEachVertexElement(const VertexFormat& fmt, const TFunc& func) +{ + using VFF = VertexFormatFlags; + + if (fmt.m_Flags & VFF::Position) + func(VERTEX_ELEMENT_POSITION); + if (fmt.m_Flags & VFF::Normal) + func(VERTEX_ELEMENT_NORMAL); + if (fmt.m_Flags & VFF::Color) + func(VERTEX_ELEMENT_COLOR); + if (fmt.m_Flags & VFF::Specular) + func(VERTEX_ELEMENT_SPECULAR); + if (fmt.m_Flags & VFF::TangentS) + func(VERTEX_ELEMENT_TANGENT_S); + if (fmt.m_Flags & VFF::TangentT) + func(VERTEX_ELEMENT_TANGENT_T); + if (fmt.m_Flags & VFF::Wrinkle) + func(VERTEX_ELEMENT_WRINKLE); + if (fmt.m_Flags & VFF::BoneIndex) + func(VERTEX_ELEMENT_BONEINDEX); + + if (fmt.m_BoneWeightCount >= 1) + func(VERTEX_ELEMENT_BONEWEIGHTS1); + if (fmt.m_BoneWeightCount >= 2) + func(VERTEX_ELEMENT_BONEWEIGHTS2); + if (fmt.m_BoneWeightCount >= 3) + func(VERTEX_ELEMENT_BONEWEIGHTS3); + if (fmt.m_BoneWeightCount >= 4) + func(VERTEX_ELEMENT_BONEWEIGHTS4); + + switch (fmt.m_UserDataSize) + { + default: + assert(!"Unknown userdata size"); + case 0: + break; + case 1: + func(VERTEX_ELEMENT_USERDATA1); + break; + case 2: + func(VERTEX_ELEMENT_USERDATA2); + break; + case 3: + func(VERTEX_ELEMENT_USERDATA3); + break; + case 4: + func(VERTEX_ELEMENT_USERDATA4); + break; + } + + for (int i = 0; i < VERTEX_MAX_TEXTURE_COORDINATES; i++) + { + auto texCoordSize = fmt.GetTexCoordSize(i); + if (texCoordSize > 0) + func(VertexElement_t(VERTEX_ELEMENT_TEXCOORD1D_0 + ((texCoordSize - 1) * VERTEX_MAX_TEXTURE_COORDINATES) + i)); + } +} + +size_t VertexFormat::GetVertexSize() const +{ + size_t size = 0; + + const auto compression = GetCompressionType(); + const auto& elemTypes = GetElemTypes(compression); + + ForEachVertexElement(*this, [&size, &elemTypes](VertexElement_t elemType) + { + size += elemTypes[elemType].GetTotalSize(); + }); + + return size; +} + uint_fast8_t VertexFormat::GetVertexElements(Element* elements, uint_fast8_t maxElements, size_t* totalSize) const { assert(maxElements >= VERTEX_ELEMENT_NUMELEMENTS); - using VFF = VertexFormatFlags; size_t totalSizeTemp = 0; uint_fast8_t elemCount = 0; @@ -188,58 +251,7 @@ uint_fast8_t VertexFormat::GetVertexElements(Element* elements, uint_fast8_t max totalSizeTemp += e.m_Type->GetTotalSize(); }; - if (m_Flags & VFF::Position) - StoreElement(VERTEX_ELEMENT_POSITION); - if (m_Flags & VFF::Normal) - StoreElement(VERTEX_ELEMENT_NORMAL); - if (m_Flags & VFF::Color) - StoreElement(VERTEX_ELEMENT_COLOR); - if (m_Flags & VFF::Specular) - StoreElement(VERTEX_ELEMENT_SPECULAR); - if (m_Flags & VFF::TangentS) - StoreElement(VERTEX_ELEMENT_TANGENT_S); - if (m_Flags & VFF::TangentT) - StoreElement(VERTEX_ELEMENT_TANGENT_T); - if (m_Flags & VFF::Wrinkle) - StoreElement(VERTEX_ELEMENT_WRINKLE); - if (m_Flags & VFF::BoneIndex) - StoreElement(VERTEX_ELEMENT_BONEINDEX); - - if (m_BoneWeightCount >= 1) - StoreElement(VERTEX_ELEMENT_BONEWEIGHTS1); - if (m_BoneWeightCount >= 2) - StoreElement(VERTEX_ELEMENT_BONEWEIGHTS2); - if (m_BoneWeightCount >= 3) - StoreElement(VERTEX_ELEMENT_BONEWEIGHTS3); - if (m_BoneWeightCount >= 4) - StoreElement(VERTEX_ELEMENT_BONEWEIGHTS4); - - switch (m_UserDataSize) - { - default: - assert(!"Unknown userdata size"); - case 0: - break; - case 1: - StoreElement(VERTEX_ELEMENT_USERDATA1); - break; - case 2: - StoreElement(VERTEX_ELEMENT_USERDATA2); - break; - case 3: - StoreElement(VERTEX_ELEMENT_USERDATA3); - break; - case 4: - StoreElement(VERTEX_ELEMENT_USERDATA4); - break; - } - - for (int i = 0; i < VERTEX_MAX_TEXTURE_COORDINATES; i++) - { - auto texCoordSize = GetTexCoordSize(i); - if (texCoordSize > 0) - StoreElement(VertexElement_t(VERTEX_ELEMENT_TEXCOORD1D_0 + ((texCoordSize - 1) * VERTEX_MAX_TEXTURE_COORDINATES) + i)); - } + ForEachVertexElement(*this, StoreElement); if (totalSize) *totalSize = totalSizeTemp; diff --git a/shaderapivulkan/src/TF2Vulkan/VulkanMesh.cpp b/shaderapivulkan/src/TF2Vulkan/VulkanMesh.cpp index 42a87c8..b318aa9 100644 --- a/shaderapivulkan/src/TF2Vulkan/VulkanMesh.cpp +++ b/shaderapivulkan/src/TF2Vulkan/VulkanMesh.cpp @@ -1,4 +1,4 @@ -#include "StateManagerDynamic.h" +#include "IShaderAPI/IShaderAPI_StateManagerDynamic.h" #include "interface/IMaterialInternal.h" #include "interface/internal/IBufferPoolInternal.h" #include "interface/internal/IShaderDeviceInternal.h" @@ -13,9 +13,7 @@ static std::aligned_storage_t<256> s_FallbackMeshData; static void AssertCheckHeap() { -#ifdef _DEBUG //assert(_CrtCheckMemory()); -#endif } void VulkanGPUBuffer::UpdateInnerBuffer(const char* dbgName, @@ -344,7 +342,7 @@ int VulkanMesh::GetRoomRemaining() const } VulkanIndexBuffer::VulkanIndexBuffer(bool isDynamic) : - m_IsDynamic(isDynamic) + VulkanGPUBuffer(isDynamic) { } @@ -360,10 +358,16 @@ MaterialIndexFormat_t VulkanIndexBuffer::IndexFormat() const return MaterialIndexFormat_t(); } +bool VulkanVertexBuffer::IsDynamic() const +{ + LOG_FUNC(); + return VulkanGPUBuffer::IsDynamic(); +} + bool VulkanIndexBuffer::IsDynamic() const { LOG_FUNC(); - return m_IsDynamic; + return VulkanGPUBuffer::IsDynamic(); } void VulkanIndexBuffer::BeginCastBuffer(MaterialIndexFormat_t format) @@ -432,6 +436,11 @@ void VulkanIndexBuffer::ValidateData(int indexCount, const IndexDesc_t& desc) NOT_IMPLEMENTED_FUNC(); } +VulkanGPUBuffer::VulkanGPUBuffer(bool isDynamic) : + m_IsDynamic(isDynamic) +{ +} + void VulkanGPUBuffer::GetGPUBuffer(vk::Buffer& buffer, size_t& offset) const { if (auto foundBuf = std::get_if(&m_Buffer)) @@ -461,7 +470,7 @@ size_t VulkanIndexBuffer::IndexDataSize() const } VulkanVertexBuffer::VulkanVertexBuffer(const VertexFormat& format, bool isDynamic) : - m_IsDynamic(isDynamic), + VulkanGPUBuffer(isDynamic), m_Format(format) { } @@ -478,12 +487,6 @@ VertexFormat_t VulkanVertexBuffer::GetVertexFormat() const return VertexFormat_t(); } -bool VulkanVertexBuffer::IsDynamic() const -{ - LOG_FUNC(); - return m_IsDynamic; -} - void VulkanVertexBuffer::BeginCastBuffer(VertexFormat_t format) { NOT_IMPLEMENTED_FUNC(); @@ -505,6 +508,8 @@ bool VulkanVertexBuffer::Lock(int vertexCount, bool append, VertexDesc_t& desc) LOG_FUNC(); AssertCheckHeap(); + assert(!m_Format.IsUnknownFormat()); + if (append) NOT_IMPLEMENTED_FUNC(); diff --git a/shaderapivulkan/src/TF2Vulkan/VulkanMesh.h b/shaderapivulkan/src/TF2Vulkan/VulkanMesh.h index 33ec114..ab9297e 100644 --- a/shaderapivulkan/src/TF2Vulkan/VulkanMesh.h +++ b/shaderapivulkan/src/TF2Vulkan/VulkanMesh.h @@ -18,14 +18,18 @@ namespace TF2Vulkan class VulkanGPUBuffer { public: + explicit VulkanGPUBuffer(bool isDynamic); + void GetGPUBuffer(vk::Buffer& buffer, size_t& offset) const; - virtual bool IsDynamic() const = 0; + bool IsDynamic() const { return m_IsDynamic; } protected: void UpdateInnerBuffer(const char* dbgName, const void* newData, size_t newSize, vk::BufferUsageFlags usage); private: + bool m_IsDynamic; + std::variant m_Buffer; }; @@ -55,7 +59,6 @@ namespace TF2Vulkan size_t VertexDataSize() const; private: - bool m_IsDynamic; VertexFormat m_Format; std::vector m_DataBuffer; @@ -91,7 +94,6 @@ namespace TF2Vulkan size_t IndexDataSize() const; private: - bool m_IsDynamic = false; std::vector m_Indices; }; diff --git a/stdshader_vulkan/src/shaders/CBaseShader.cpp b/stdshader_vulkan/src/shaders/BaseShader.cpp similarity index 100% rename from stdshader_vulkan/src/shaders/CBaseShader.cpp rename to stdshader_vulkan/src/shaders/BaseShader.cpp diff --git a/stdshader_vulkan/src/shaders/BaseShaderNext.h b/stdshader_vulkan/src/shaders/BaseShaderNext.h index cdd9215..82eb3fc 100644 --- a/stdshader_vulkan/src/shaders/BaseShaderNext.h +++ b/stdshader_vulkan/src/shaders/BaseShaderNext.h @@ -109,12 +109,12 @@ namespace TF2Vulkan{ namespace Shaders class Fallback_ ## shaderName final : public ::TF2Vulkan::Shaders::ShaderNext \ { \ public: \ - const char* GetName() const override { return #shaderName; } \ - const char* GetFallbackShader(IMaterialVar**) const override { return #fallbackShaderName; } \ - void OnInitShader(IShaderNextFactory&) override {} \ + const char* GetName() const override { LOG_FUNC(); return #shaderName; } \ + const char* GetFallbackShader(IMaterialVar**) const override { LOG_FUNC(); return #fallbackShaderName; } \ + void OnInitShader(IShaderNextFactory&) override { LOG_FUNC(); } \ protected: \ - void OnInitShaderInstance(IMaterialVar**, IShaderInit*, const char*) override { /*throw __FUNCSIG__;*/ } \ - void OnDrawElements(const OnDrawElementsParams& params) override { /*throw __FUNCSIG__*/ } \ + void OnInitShaderInstance(IMaterialVar**, IShaderInit*, const char*) override { LOG_FUNC(); /*throw __FUNCSIG__;*/ } \ + void OnDrawElements(const OnDrawElementsParams& params) override { LOG_FUNC(); /*throw __FUNCSIG__*/ } \ }; \ static const Fallback_ ## shaderName ## ::InstanceRegister s_FallbackShader_ ## shaderName; } } diff --git a/stdshader_vulkan/src/shaders/DebugDrawEnvmapMask.cpp b/stdshader_vulkan/src/shaders/DebugDrawEnvmapMask.cpp deleted file mode 100644 index 91577f7..0000000 --- a/stdshader_vulkan/src/shaders/DebugDrawEnvmapMask.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "BaseShaderNext.h" - -#include - -using namespace TF2Vulkan; -using namespace TF2Vulkan::Shaders; - -namespace -{ - struct DebugDrawEnvmapMaskParams - { - NSHADER_PARAM(SHOWALPHA, SHADER_PARAM_TYPE_INTEGER, "0", ""); - }; - - class DebugDrawEnvmapMask : public ShaderNext - { - public: - const char* GetName() const override { return "DebugDrawEnvmapMask"; } - - // Inherited via ShaderNext - void OnInitShader(IShaderNextFactory& mgr) override { NOT_IMPLEMENTED_FUNC_NOBREAK(); } - void OnInitShaderInstance(IMaterialVar** ppParams, IShaderInit* pShaderInit, const char* pMaterialName) override - { - NOT_IMPLEMENTED_FUNC_NOBREAK(); - } - - void OnDrawElements(const OnDrawElementsParams& params) override - { - NOT_IMPLEMENTED_FUNC_NOBREAK(); - } - }; - - static const DebugDrawEnvmapMask::InstanceRegister s_DebugDrawEnvmapMask; -} diff --git a/stdshader_vulkan/src/shaders/DepthWrite.cpp b/stdshader_vulkan/src/shaders/DepthWrite.cpp deleted file mode 100644 index 359502f..0000000 --- a/stdshader_vulkan/src/shaders/DepthWrite.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "BaseShaderNext.h" - -#include - -using namespace TF2Vulkan; -using namespace TF2Vulkan::Shaders; - -namespace -{ - struct DepthWriteParams - { - NSHADER_PARAM(ALPHATESTREFERENCE, SHADER_PARAM_TYPE_FLOAT, "", "Alpha reference value"); - NSHADER_PARAM(DISPLACEMENTMAP, SHADER_PARAM_TYPE_TEXTURE, "shadertest/BaseTexture", "Displacement map"); - NSHADER_PARAM(DISPLACEMENTWRINKLE, SHADER_PARAM_TYPE_BOOL, "0", "Displacement map contains wrinkle displacements"); - }; - - class DepthWrite final : public ShaderNext - { - public: - const char* GetName() const override { return "DepthWrite"; } - - //void OnInitShaderParams(IMaterialVar** params, const char* materialName) override; - - void OnInitShader(IShaderNextFactory& mgr) override { NOT_IMPLEMENTED_FUNC_NOBREAK(); } - virtual void OnInitShaderInstance(IMaterialVar** ppParams, IShaderInit* pShaderInit, const char* pMaterialName) override - { - NOT_IMPLEMENTED_FUNC_NOBREAK(); - } - virtual void OnDrawElements(const OnDrawElementsParams& params) override - { - NOT_IMPLEMENTED_FUNC_NOBREAK(); - } - }; - - static const DepthWrite::InstanceRegister s_DepthWrite; -} diff --git a/stdshader_vulkan/src/shaders/XLitGeneric.cpp b/stdshader_vulkan/src/shaders/XLitGeneric.cpp index 12a1497..78bb875 100644 --- a/stdshader_vulkan/src/shaders/XLitGeneric.cpp +++ b/stdshader_vulkan/src/shaders/XLitGeneric.cpp @@ -98,16 +98,31 @@ inline namespace XLitGeneric } static constexpr s_SpecConstLayout; + enum class DerivedShaderType + { + VertexLitGeneric, + UnlitGeneric, + Wireframe, + DepthWrite, + DebugDrawEnvmapMask, + }; + class Shader : public ShaderNext { public: + explicit Shader(DerivedShaderType derivedType) : m_DerivedType(derivedType) {} + void OnInitShader(IShaderNextFactory& instanceMgr) override; void OnInitShaderParams(IMaterialVar** params, const char* materialName) override; void OnInitShaderInstance(IMaterialVar** params, IShaderInit* shaderInit, const char* materialName) override; void OnDrawElements(const OnDrawElementsParams& params) override; - virtual bool IsVertexLitGeneric() const { return false; } + DerivedShaderType GetDerivedType() const { return m_DerivedType; } + + bool IsVertexLit() const { return GetDerivedType() == DerivedShaderType::VertexLitGeneric; } + + virtual bool SupportsCompressedVertices() const { return true; } private: bool WantsSkinShader(IMaterialVar** params) const; @@ -157,45 +172,52 @@ inline namespace XLitGeneric IShaderGroup* m_PSShader = nullptr; IShaderGroup* m_VSShader = nullptr; - IBufferPool* m_UBufCommon = nullptr; + IBufferPool* m_UniformBufPool = nullptr; UniformBufferIndex m_UBufCommonIndex = UniformBufferIndex::Invalid; - - IBufferPool* m_UBufModelMatrices = nullptr; UniformBufferIndex m_UBufModelMatricesIndex = UniformBufferIndex::Invalid; - - IBufferPool* m_UniformBuf = nullptr; UniformBufferIndex m_UniformBufferIndex = UniformBufferIndex::Invalid; - }; - - class UnlitGeneric final : public Shader - { - public: - const char* GetName() const override { return "UnlitGeneric"; } - }; - - class VertexLitGeneric final : public Shader - { - public: - const char* GetName() const override { return "VertexLitGeneric"; } - bool IsVertexLitGeneric() const override { return true; } + DerivedShaderType m_DerivedType; }; - class Wireframe final : public Shader +#define XLITGENERIC_DERIVED(derivedShaderName) \ + class derivedShaderName : public Shader \ + { \ + public: \ + derivedShaderName() : Shader(DerivedShaderType::derivedShaderName) {} \ + const char* GetName() const override { return #derivedShaderName; } \ + }; \ + static const DefaultInstanceRegister s_ ## derivedShaderName; + +#define SHADER_ALIAS(aliasName, baseName) \ + class aliasName final : public baseName \ + { \ + public: \ + const char* GetName() const override { return #aliasName; } \ + }; \ + static const DefaultInstanceRegister s_ ## aliasName; + + XLITGENERIC_DERIVED(DebugDrawEnvmapMask); + XLITGENERIC_DERIVED(DepthWrite); + XLITGENERIC_DERIVED(UnlitGeneric); + XLITGENERIC_DERIVED(VertexLitGeneric); + + class Wireframe : public Shader { public: + Wireframe() : Shader(DerivedShaderType::Wireframe) {} const char* GetName() const override { return "Wireframe"; } void OnInitShaderParams(IMaterialVar** params, const char* materialName) override; + void OnDrawElements(const OnDrawElementsParams& params) override; + bool SupportsCompressedVertices() const override { return false; } }; - - static const DefaultInstanceRegister s_UnlitGeneric; - static const DefaultInstanceRegister s_VertexLitGeneric; static const DefaultInstanceRegister s_Wireframe; + + SHADER_ALIAS(Wireframe_DX8, Wireframe); + SHADER_ALIAS(Wireframe_DX9, Wireframe); } DEFINE_NSHADER_FALLBACK(UnlitGeneric_DX8, UnlitGeneric); -DEFINE_NSHADER_FALLBACK(Wireframe_DX8, Wireframe); -DEFINE_NSHADER_FALLBACK(Wireframe_DX9, Wireframe); DEFINE_NSHADER_FALLBACK(DebugMorphAccumulator, UnlitGeneric); //DEFINE_NSHADER_FALLBACK(VertexLitGeneric_DX8, VertexLitGeneric); @@ -206,6 +228,8 @@ static ConVar mat_luxels("mat_luxels", "0", FCVAR_CHEAT); void Wireframe::OnInitShaderParams(IMaterialVar** params, const char* materialName) { + LOG_FUNC(); + SET_FLAGS(MATERIAL_VAR_NO_DEBUG_OVERRIDE); SET_FLAGS(MATERIAL_VAR_NOFOG); SET_FLAGS(MATERIAL_VAR_WIREFRAME); @@ -213,6 +237,16 @@ void Wireframe::OnInitShaderParams(IMaterialVar** params, const char* materialNa Shader::OnInitShaderParams(params, materialName); } +void Wireframe::OnDrawElements(const OnDrawElementsParams& params) +{ + LOG_FUNC(); + + //if (IsSnapshotting()) + // __debugbreak(); + + Shader::OnDrawElements(params); +} + void Shader::OnInitShader(IShaderNextFactory& instanceMgr) { LOG_FUNC(); @@ -220,13 +254,9 @@ void Shader::OnInitShader(IShaderNextFactory& instanceMgr) m_VSShader = &instanceMgr.FindOrCreateShaderGroup(ShaderType::Vertex, "xlitgeneric_vs", s_SpecConstLayout); m_PSShader = &instanceMgr.FindOrCreateShaderGroup(ShaderType::Pixel, "xlitgeneric_ps", s_SpecConstLayout); - m_UBufCommon = &instanceMgr.GetUniformBufferPool(); + m_UniformBufPool = &instanceMgr.GetUniformBufferPool(); m_UBufCommonIndex = m_VSShader->FindUniformBuffer(UniformBufferStandardType::ShaderCommon); - - m_UBufModelMatrices = &instanceMgr.GetUniformBufferPool(); m_UBufModelMatricesIndex = m_VSShader->FindUniformBuffer(UniformBufferStandardType::VSModelMatrices); - - m_UniformBuf = &instanceMgr.GetUniformBufferPool(); m_UniformBufferIndex = m_VSShader->FindUniformBuffer(UniformBufferStandardType::ShaderCustom); } @@ -373,7 +403,10 @@ void Shader::DrawCloakBlendedPass(DrawParams& params) //SetInitialShadowState(); // Set stream format (note that this shader supports compression) - params.m_Format.AddFlags(VertexFormatFlags::Position | VertexFormatFlags::Normal | VertexFormatFlags::Meta_Compressed); + params.m_Format.AddFlags(VertexFormatFlags::Position | VertexFormatFlags::Normal); + + if (SupportsCompressedVertices()) + params.m_Format.AddFlags(VertexFormatFlags::Meta_Compressed); // Textures @@ -456,7 +489,7 @@ void Shader::OnDrawElements(const OnDrawElementsParams& params) DrawParams drawParams(params); - const bool bVertexLitGeneric = IsVertexLitGeneric(); + const bool bVertexLitGeneric = IsVertexLit(); const bool hasDiffuseLighting = drawParams.m_SpecConsts.DIFFUSELIGHTING = bVertexLitGeneric; const bool bIsAlphaTested = IS_FLAG_SET(MATERIAL_VAR_ALPHATEST); const bool bHasBaseTexture = drawParams.m_SpecConsts.TEXACTIVE_BASETEXTURE = params[BASETEXTURE]->IsTexture(); @@ -488,7 +521,9 @@ void Shader::OnDrawElements(const OnDrawElementsParams& params) SetBlendingShadowState(EvaluateBlendRequirements()); drawParams.m_Format.AddFlags(VertexFormatFlags::Position); - drawParams.m_Format.AddFlags(VertexFormatFlags::Meta_Compressed); + + if (SupportsCompressedVertices()) + drawParams.m_Format.AddFlags(VertexFormatFlags::Meta_Compressed); if (bHasVertexAlpha || bHasVertexColor) drawParams.m_Format.AddFlags(VertexFormatFlags::Color); @@ -566,9 +601,9 @@ void Shader::OnDrawElements(const OnDrawElementsParams& params) } // Update data and bind uniform buffers - params.dynamic->BindUniformBuffer(m_UniformBuf->Create(drawParams.m_Uniforms), m_UniformBufferIndex); - params.dynamic->BindUniformBuffer(m_UBufCommon->Create(drawParams.m_UniformsCommon), m_UBufCommonIndex); - params.dynamic->BindUniformBuffer(m_UBufModelMatrices->Create(drawParams.m_ModelMatrices), m_UBufModelMatricesIndex); + params.dynamic->BindUniformBuffer(m_UniformBufPool->Create(drawParams.m_Uniforms), m_UniformBufferIndex); + params.dynamic->BindUniformBuffer(m_UniformBufPool->Create(drawParams.m_UniformsCommon), m_UBufCommonIndex); + params.dynamic->BindUniformBuffer(m_UniformBufPool->Create(drawParams.m_ModelMatrices), m_UBufModelMatricesIndex); // Set params.dynamic->SetVertexShader(m_VSShader->FindOrCreateInstance(drawParams.m_SpecConsts)); @@ -657,7 +692,7 @@ void Shader::InitParamsVertexLitGeneric(IMaterialVar** params, const char* mater // This shader can be used with hw skinning SET_FLAGS2(MATERIAL_VAR2_SUPPORTS_HW_SKINNING); - if (IsVertexLitGeneric()) + if (IsVertexLit()) { SET_FLAGS2(MATERIAL_VAR2_LIGHTING_VERTEX_LIT); } diff --git a/stdshader_vulkan/stdshader_vulkan.vcxproj b/stdshader_vulkan/stdshader_vulkan.vcxproj index 8e03638..48ed68a 100644 --- a/stdshader_vulkan/stdshader_vulkan.vcxproj +++ b/stdshader_vulkan/stdshader_vulkan.vcxproj @@ -81,14 +81,12 @@ - + - -