diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 91ad7f9afc..8f1b71a3df 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -66,7 +66,7 @@ DrawEngineVulkan::DrawEngineVulkan(VulkanContext *vulkan) vulkan_(vulkan), decodedVerts_(0), prevPrim_(GE_PRIM_INVALID), - lastVType_(-1), + lastVTypeID_(-1), pipelineManager_(nullptr), textureCache_(nullptr), framebufferManager_(nullptr), @@ -248,9 +248,9 @@ inline void DrawEngineVulkan::SetupVertexDecoderInternal(u32 vertType) { const u32 vertTypeID = (vertType & 0xFFFFFF) | (gstate.getUVGenMode() << 24); // If vtype has changed, setup the vertex decoder. - if (vertTypeID != lastVType_) { + if (vertTypeID != lastVTypeID_) { dec_ = GetVertexDecoder(vertTypeID); - lastVType_ = vertTypeID; + lastVTypeID_ = vertTypeID; } } @@ -289,11 +289,6 @@ void DrawEngineVulkan::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, numDrawCalls++; vertexCountInDrawCalls += vertexCount; - if (g_Config.bSoftwareSkinning && (vertType & GE_VTYPE_WEIGHT_MASK)) { - DecodeVertsStep(); - decodeCounter_++; - } - if (prim == GE_PRIM_RECTANGLES && (gstate.getTextureAddress(0) & 0x3FFFFFFF) == (gstate.getFrameBufAddress() & 0x3FFFFFFF)) { // Rendertarget == texture? if (!g_Config.bDisableSlowFramebufEffects) { @@ -305,7 +300,7 @@ void DrawEngineVulkan::SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, void DrawEngineVulkan::DecodeVerts() { for (; decodeCounter_ < numDrawCalls; decodeCounter_++) { - DecodeVertsStep(); + DecodeVertsStep(decoded); } // Sanity check if (indexGen.Prim() < 0) { @@ -315,7 +310,7 @@ void DrawEngineVulkan::DecodeVerts() { } } -void DrawEngineVulkan::DecodeVertsStep() { +void DrawEngineVulkan::DecodeVertsStep(u8 *decoded) { const int i = decodeCounter_; const DeferredDrawCall &dc = drawCalls[i]; @@ -535,7 +530,7 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) { } prim = indexGen.Prim(); - bool hasColor = (lastVType_ & GE_VTYPE_COL_MASK) != GE_VTYPE_COL_NONE; + bool hasColor = (lastVTypeID_ & GE_VTYPE_COL_MASK) != GE_VTYPE_COL_NONE; if (gstate.isModeThrough()) { gstate_c.vertexFullAlpha = gstate_c.vertexFullAlpha && (hasColor || gstate.getMaterialAmbientA() == 255); } else { @@ -555,7 +550,7 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) { Uint8x4ToFloat4(bc, dynState.blendColor); vkCmdSetBlendConstants(cmd_, bc); shaderManager_->UpdateUniforms(); - shaderManager_->GetShaders(prim, lastVType_, &vshader, &fshader, useHWTransform); + shaderManager_->GetShaders(prim, lastVTypeID_, &vshader, &fshader, useHWTransform); VulkanPipeline *pipeline = pipelineManager_->GetOrCreatePipeline(pipelineLayout_, pipelineKey, dec_, vshader, fshader, true); if (!pipeline) { // Already logged, let's bail out. @@ -600,7 +595,7 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) { } } else { DecodeVerts(); - bool hasColor = (lastVType_ & GE_VTYPE_COL_MASK) != GE_VTYPE_COL_NONE; + bool hasColor = (lastVTypeID_ & GE_VTYPE_COL_MASK) != GE_VTYPE_COL_NONE; if (gstate.isModeThrough()) { gstate_c.vertexFullAlpha = gstate_c.vertexFullAlpha && (hasColor || gstate.getMaterialAmbientA() == 255); } else { @@ -661,7 +656,7 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) { Uint8x4ToFloat4(bc, dynState.blendColor); vkCmdSetBlendConstants(cmd_, bc); shaderManager_->UpdateUniforms(); - shaderManager_->GetShaders(prim, lastVType_, &vshader, &fshader, useHWTransform); + shaderManager_->GetShaders(prim, lastVTypeID_, &vshader, &fshader, useHWTransform); VulkanPipeline *pipeline = pipelineManager_->GetOrCreatePipeline(pipelineLayout_, pipelineKey, dec_, vshader, fshader, false); if (!pipeline) { // Already logged, let's bail out. @@ -770,7 +765,7 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) { void DrawEngineVulkan::Resized() { decJitCache_->Clear(); - lastVType_ = -1; + lastVTypeID_ = -1; dec_ = NULL; // TODO: We must also wipe pipelines. for (auto iter = decoderMap_.begin(); iter != decoderMap_.end(); iter++) { diff --git a/GPU/Vulkan/DrawEngineVulkan.h b/GPU/Vulkan/DrawEngineVulkan.h index ef7eecf5b9..edffc85522 100644 --- a/GPU/Vulkan/DrawEngineVulkan.h +++ b/GPU/Vulkan/DrawEngineVulkan.h @@ -149,7 +149,7 @@ public: private: void DecodeVerts(); - void DecodeVertsStep(); + void DecodeVertsStep(u8 *decoded); void DoFlush(VkCommandBuffer cmd); VkDescriptorSet GetDescriptorSet(VkImageView imageView, VkSampler sampler, VkBuffer base, VkBuffer light, VkBuffer bone); @@ -216,7 +216,7 @@ private: int decodedVerts_; GEPrimitiveType prevPrim_; - u32 lastVType_; + u32 lastVTypeID_; TransformedVertex *transformed; TransformedVertex *transformedExpanded; diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 808a94616e..de84577aad 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -583,13 +583,8 @@ void GPU_Vulkan::UpdateCmdInfo() { cmdInfo_[GE_CMD_TEXOFFSETV].flags |= FLAG_FLUSHBEFOREONCHANGE; } - if (g_Config.bSoftwareSkinning) { - cmdInfo_[GE_CMD_VERTEXTYPE].flags &= ~FLAG_FLUSHBEFOREONCHANGE; - cmdInfo_[GE_CMD_VERTEXTYPE].func = &GPU_Vulkan::Execute_VertexTypeSkinning; - } else { - cmdInfo_[GE_CMD_VERTEXTYPE].flags |= FLAG_FLUSHBEFOREONCHANGE; - cmdInfo_[GE_CMD_VERTEXTYPE].func = &GPU_Vulkan::Execute_VertexType; - } + cmdInfo_[GE_CMD_VERTEXTYPE].flags |= FLAG_FLUSHBEFOREONCHANGE; + cmdInfo_[GE_CMD_VERTEXTYPE].func = &GPU_Vulkan::Execute_VertexType; } void GPU_Vulkan::ReapplyGfxStateInternal() { @@ -830,24 +825,6 @@ void GPU_Vulkan::Execute_VertexType(u32 op, u32 diff) { } } -void GPU_Vulkan::Execute_VertexTypeSkinning(u32 op, u32 diff) { - // Don't flush when weight count changes, unless morph is enabled. - if ((diff & ~GE_VTYPE_WEIGHTCOUNT_MASK) || (op & GE_VTYPE_MORPHCOUNT_MASK) != 0) { - // Restore and flush - gstate.vertType ^= diff; - Flush(); - gstate.vertType ^= diff; - if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) - shaderManager_->DirtyUniform(DIRTY_UVSCALEOFFSET); - // In this case, we may be doing weights and morphs. - // Update any bone matrix uniforms so it uses them correctly. - if ((op & GE_VTYPE_MORPHCOUNT_MASK) != 0) { - shaderManager_->DirtyUniform(gstate_c.deferredVertTypeDirty); - gstate_c.deferredVertTypeDirty = 0; - } - } -} - void GPU_Vulkan::Execute_Bezier(u32 op, u32 diff) { // This also make skipping drawing very effective. framebufferManager_->SetRenderFrameBuffer(gstate_c.framebufChanged, gstate_c.skipDrawReason); @@ -1310,35 +1287,20 @@ void GPU_Vulkan::Execute_BoneMtxNum(u32 op, u32 diff) { const int end = 12 * 8 - (op & 0x7F); int i = 0; - // If we can't use software skinning, we have to flush and dirty. - if (!g_Config.bSoftwareSkinning || (gstate.vertType & GE_VTYPE_MORPHCOUNT_MASK) != 0) { - while ((src[i] >> 24) == GE_CMD_BONEMATRIXDATA) { - const u32 newVal = src[i] << 8; - if (dst[i] != newVal) { - Flush(); - dst[i] = newVal; - } - if (++i >= end) { - break; - } + while ((src[i] >> 24) == GE_CMD_BONEMATRIXDATA) { + const u32 newVal = src[i] << 8; + if (dst[i] != newVal) { + Flush(); + dst[i] = newVal; } + if (++i >= end) { + break; + } + } - const int numPlusCount = (op & 0x7F) + i; - for (int num = op & 0x7F; num < numPlusCount; num += 12) { - shaderManager_->DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12)); - } - } else { - while ((src[i] >> 24) == GE_CMD_BONEMATRIXDATA) { - dst[i] = src[i] << 8; - if (++i >= end) { - break; - } - } - - const int numPlusCount = (op & 0x7F) + i; - for (int num = op & 0x7F; num < numPlusCount; num += 12) { - gstate_c.deferredVertTypeDirty |= DIRTY_BONEMATRIX0 << (num / 12); - } + const int numPlusCount = (op & 0x7F) + i; + for (int num = op & 0x7F; num < numPlusCount; num += 12) { + shaderManager_->DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12)); } const int count = i; @@ -1354,13 +1316,8 @@ void GPU_Vulkan::Execute_BoneMtxData(u32 op, u32 diff) { int num = gstate.boneMatrixNumber & 0x7F; u32 newVal = op << 8; if (num < 96 && newVal != ((const u32 *)gstate.boneMatrix)[num]) { - // Bone matrices should NOT flush when software skinning is enabled! - if (!g_Config.bSoftwareSkinning || (gstate.vertType & GE_VTYPE_MORPHCOUNT_MASK) != 0) { - Flush(); - shaderManager_->DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12)); - } else { - gstate_c.deferredVertTypeDirty |= DIRTY_BONEMATRIX0 << (num / 12); - } + Flush(); + shaderManager_->DirtyUniform(DIRTY_BONEMATRIX0 << (num / 12)); ((u32 *)gstate.boneMatrix)[num] = newVal; } num++; @@ -1916,13 +1873,8 @@ void GPU_Vulkan::FastLoadBoneMatrix(u32 target) { if ((num - 12 * mtxNum) != 0) { uniformsToDirty |= DIRTY_BONEMATRIX0 << ((mtxNum + 1) & 7); } - - if (!g_Config.bSoftwareSkinning || (gstate.vertType & GE_VTYPE_MORPHCOUNT_MASK) != 0) { - Flush(); - shaderManager_->DirtyUniform(uniformsToDirty); - } else { - gstate_c.deferredVertTypeDirty |= uniformsToDirty; - } + Flush(); + shaderManager_->DirtyUniform(uniformsToDirty); gstate.FastLoadBoneMatrix(target); }