Compare commits
15 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1226f0fdb3 | ||
|
|
405a834ede | ||
|
|
a7d2dd0824 | ||
|
|
ab7d332972 | ||
|
|
a5e7a6fb0a | ||
|
|
ef1496d0d5 | ||
|
|
57f1e81a71 | ||
|
|
f46ae98cb6 | ||
|
|
7548ec23e7 | ||
|
|
088ee5d0b4 | ||
|
|
a275751875 | ||
|
|
9324eb0cc9 | ||
|
|
d5d23be0b0 | ||
|
|
c5fa5fe11b | ||
|
|
75435f9c2b |
5 changed files with 89 additions and 1066 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
|
@ -26,3 +26,10 @@
|
|||
/dxvk-1.10.1.tar.gz
|
||||
/dxvk-1.10.2.tar.gz
|
||||
/dxvk-1.10.3.tar.gz
|
||||
/dxvk-2.5.1.tar.gz
|
||||
/libdisplay-info-275e645.tar.gz
|
||||
/dxvk-2.5.2.tar.gz
|
||||
/dxvk-2.5.3.tar.gz
|
||||
/dxvk-2.6.1.tar.gz
|
||||
/dxvk-2.6.2.tar.gz
|
||||
/dxvk-2.7.1.tar.gz
|
||||
|
|
|
|||
33
3308.patch
33
3308.patch
|
|
@ -1,33 +0,0 @@
|
|||
From 5e0467cafb6ef8041a029d4916ab5fa8bcb38bae Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Franti=C5=A1ek=20Zatloukal?= <fzatlouk@redhat.com>
|
||||
Date: Thu, 23 Mar 2023 21:38:02 +0100
|
||||
Subject: [PATCH] [util] Include cstdint to fix compilation with GCC 13
|
||||
|
||||
---
|
||||
src/util/config/config.h | 1 +
|
||||
src/util/util_bit.h | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/src/util/config/config.h b/src/util/config/config.h
|
||||
index eb8492544f3..8bf4739e847 100644
|
||||
--- a/src/util/config/config.h
|
||||
+++ b/src/util/config/config.h
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
+#include <cstdint>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
diff --git a/src/util/util_bit.h b/src/util/util_bit.h
|
||||
index f4bb7a44cb1..712be4beabf 100644
|
||||
--- a/src/util/util_bit.h
|
||||
+++ b/src/util/util_bit.h
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "util_likely.h"
|
||||
#include "util_math.h"
|
||||
|
||||
+#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
|
|
@ -1,969 +0,0 @@
|
|||
diff --git a/dxvk.conf b/dxvk.conf
|
||||
index ebab3557..3e839171 100644
|
||||
--- a/dxvk.conf
|
||||
+++ b/dxvk.conf
|
||||
@@ -19,9 +19,10 @@
|
||||
# d3d9.maxFrameLatency = 0
|
||||
|
||||
|
||||
-# Enables a frame rate limiter, unless the game is already
|
||||
-# limited to the same refresh rate by vertical synchronization.
|
||||
-#
|
||||
+# Enables frame rate limiter. The main purpose of this is to work around
|
||||
+# bugs in games that have physics or other simulation tied to their frame
|
||||
+# rate, but do not provide their own limiter.
|
||||
+#
|
||||
# Supported values : Any non-negative integer
|
||||
|
||||
# dxgi.maxFrameRate = 0
|
||||
diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp
|
||||
index c3cba249..a4cee343 100644
|
||||
--- a/src/d3d11/d3d11_context.cpp
|
||||
+++ b/src/d3d11/d3d11_context.cpp
|
||||
@@ -2525,7 +2525,11 @@ namespace dxvk {
|
||||
m_state.om.dsState = depthStencilState;
|
||||
ApplyDepthStencilState();
|
||||
}
|
||||
-
|
||||
+
|
||||
+ // The D3D11 runtime only appears to store the low 8 bits,
|
||||
+ // and some games rely on this behaviour. Do the same here.
|
||||
+ StencilRef &= 0xFF;
|
||||
+
|
||||
if (m_state.om.stencilRef != StencilRef) {
|
||||
m_state.om.stencilRef = StencilRef;
|
||||
ApplyStencilRef();
|
||||
diff --git a/src/d3d11/d3d11_context_imm.cpp b/src/d3d11/d3d11_context_imm.cpp
|
||||
index adde00ae..0c5bd613 100644
|
||||
--- a/src/d3d11/d3d11_context_imm.cpp
|
||||
+++ b/src/d3d11/d3d11_context_imm.cpp
|
||||
@@ -40,6 +40,11 @@ namespace dxvk {
|
||||
|
||||
|
||||
D3D11ImmediateContext::~D3D11ImmediateContext() {
|
||||
+ // Avoids hanging when in this state, see comment
|
||||
+ // in DxvkDevice::~DxvkDevice.
|
||||
+ if (this_thread::isInModuleDetachment())
|
||||
+ return;
|
||||
+
|
||||
Flush();
|
||||
SynchronizeCsThread(DxvkCsThread::SynchronizeAll);
|
||||
SynchronizeDevice();
|
||||
diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp
|
||||
index 3dcad9ba..e8149729 100644
|
||||
--- a/src/d3d11/d3d11_device.cpp
|
||||
+++ b/src/d3d11/d3d11_device.cpp
|
||||
@@ -591,7 +591,10 @@ namespace dxvk {
|
||||
ID3D11InputLayout** ppInputLayout) {
|
||||
InitReturnPtr(ppInputLayout);
|
||||
|
||||
- if (pInputElementDescs == nullptr)
|
||||
+ // This check is somehow even correct, passing null with zero
|
||||
+ // size will always fail but passing non-null with zero size
|
||||
+ // works, provided the shader does not have any actual inputs
|
||||
+ if (!pInputElementDescs)
|
||||
return E_INVALIDARG;
|
||||
|
||||
try {
|
||||
@@ -603,6 +606,7 @@ namespace dxvk {
|
||||
|
||||
uint32_t attrMask = 0;
|
||||
uint32_t bindMask = 0;
|
||||
+ uint32_t locationMask = 0;
|
||||
|
||||
std::array<DxvkVertexAttribute, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT> attrList;
|
||||
std::array<DxvkVertexBinding, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT> bindList;
|
||||
@@ -683,9 +687,19 @@ namespace dxvk {
|
||||
if (entry != nullptr) {
|
||||
attrMask |= 1u << i;
|
||||
bindMask |= 1u << binding.binding;
|
||||
+ locationMask |= 1u << attrib.location;
|
||||
}
|
||||
}
|
||||
|
||||
+ // Ensure that all inputs used by the shader are defined
|
||||
+ for (auto i = inputSignature->begin(); i != inputSignature->end(); i++) {
|
||||
+ bool isBuiltIn = DxbcIsgn::compareSemanticNames(i->semanticName, "sv_instanceid")
|
||||
+ || DxbcIsgn::compareSemanticNames(i->semanticName, "sv_vertexid");
|
||||
+
|
||||
+ if (!isBuiltIn && !(locationMask & (1u << i->registerId)))
|
||||
+ return E_INVALIDARG;
|
||||
+ }
|
||||
+
|
||||
// Compact the attribute and binding lists to filter
|
||||
// out attributes and bindings not used by the shader
|
||||
uint32_t attrCount = CompactSparseList(attrList.data(), attrMask);
|
||||
diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp
|
||||
index 56c51a7b..29ff1fbc 100644
|
||||
--- a/src/d3d11/d3d11_swapchain.cpp
|
||||
+++ b/src/d3d11/d3d11_swapchain.cpp
|
||||
@@ -35,6 +35,11 @@ namespace dxvk {
|
||||
|
||||
|
||||
D3D11SwapChain::~D3D11SwapChain() {
|
||||
+ // Avoids hanging when in this state, see comment
|
||||
+ // in DxvkDevice::~DxvkDevice.
|
||||
+ if (this_thread::isInModuleDetachment())
|
||||
+ return;
|
||||
+
|
||||
m_device->waitForSubmission(&m_presentStatus);
|
||||
m_device->waitForIdle();
|
||||
|
||||
@@ -247,9 +252,6 @@ namespace dxvk {
|
||||
DXGI_RATIONAL rate = pDisplayMode->RefreshRate;
|
||||
m_displayRefreshRate = double(rate.Numerator) / double(rate.Denominator);
|
||||
}
|
||||
-
|
||||
- if (m_presenter != nullptr)
|
||||
- m_presenter->setFrameRateLimiterRefreshRate(m_displayRefreshRate);
|
||||
}
|
||||
|
||||
|
||||
@@ -401,7 +403,6 @@ namespace dxvk {
|
||||
presenterDesc);
|
||||
|
||||
m_presenter->setFrameRateLimit(m_parent->GetOptions()->maxFrameRate);
|
||||
- m_presenter->setFrameRateLimiterRefreshRate(m_displayRefreshRate);
|
||||
|
||||
CreateRenderTargetViews();
|
||||
}
|
||||
diff --git a/src/d3d9/d3d9_adapter.cpp b/src/d3d9/d3d9_adapter.cpp
|
||||
index 4e93fb1a..ce0f4c1d 100644
|
||||
--- a/src/d3d9/d3d9_adapter.cpp
|
||||
+++ b/src/d3d9/d3d9_adapter.cpp
|
||||
@@ -183,7 +183,8 @@ namespace dxvk {
|
||||
if (MultiSampleType != D3DMULTISAMPLE_NONE
|
||||
&& (SurfaceFormat == D3D9Format::D32_LOCKABLE
|
||||
|| SurfaceFormat == D3D9Format::D32F_LOCKABLE
|
||||
- || SurfaceFormat == D3D9Format::D16_LOCKABLE))
|
||||
+ || SurfaceFormat == D3D9Format::D16_LOCKABLE
|
||||
+ || SurfaceFormat == D3D9Format::INTZ))
|
||||
return D3DERR_NOTAVAILABLE;
|
||||
|
||||
uint32_t sampleCount = std::max<uint32_t>(MultiSampleType, 1u);
|
||||
diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp
|
||||
index 734a7a0c..23b0a6fd 100644
|
||||
--- a/src/d3d9/d3d9_device.cpp
|
||||
+++ b/src/d3d9/d3d9_device.cpp
|
||||
@@ -145,6 +145,11 @@ namespace dxvk {
|
||||
|
||||
|
||||
D3D9DeviceEx::~D3D9DeviceEx() {
|
||||
+ // Avoids hanging when in this state, see comment
|
||||
+ // in DxvkDevice::~DxvkDevice.
|
||||
+ if (this_thread::isInModuleDetachment())
|
||||
+ return;
|
||||
+
|
||||
Flush();
|
||||
SynchronizeCsThread(DxvkCsThread::SynchronizeAll);
|
||||
|
||||
@@ -806,9 +811,19 @@ namespace dxvk {
|
||||
uint32_t mipLevels = dstTexInfo->IsAutomaticMip() ? 1 : dstTexInfo->Desc()->MipLevels;
|
||||
uint32_t arraySlices = std::min(srcTexInfo->Desc()->ArraySize, dstTexInfo->Desc()->ArraySize);
|
||||
|
||||
- uint32_t srcMipOffset = srcTexInfo->Desc()->MipLevels - mipLevels;
|
||||
- VkExtent3D srcFirstMipExtent = util::computeMipLevelExtent(srcTexInfo->GetExtent(), srcMipOffset);
|
||||
+ uint32_t srcMipOffset = 0;
|
||||
+ VkExtent3D srcFirstMipExtent = srcTexInfo->GetExtent();
|
||||
VkExtent3D dstFirstMipExtent = dstTexInfo->GetExtent();
|
||||
+
|
||||
+ if (srcFirstMipExtent != dstFirstMipExtent) {
|
||||
+ // UpdateTexture can be used with textures that have different mip lengths.
|
||||
+ // It will either match the the top mips or the bottom ones.
|
||||
+
|
||||
+ srcMipOffset = srcTexInfo->Desc()->MipLevels - mipLevels;
|
||||
+ srcFirstMipExtent = util::computeMipLevelExtent(srcTexInfo->GetExtent(), srcMipOffset);
|
||||
+ dstFirstMipExtent = dstTexInfo->GetExtent();
|
||||
+ }
|
||||
+
|
||||
if (srcFirstMipExtent != dstFirstMipExtent)
|
||||
return D3DERR_INVALIDCALL;
|
||||
|
||||
@@ -1343,7 +1358,8 @@ namespace dxvk {
|
||||
m_flags.set(D3D9DeviceFlag::DirtyFramebuffer);
|
||||
|
||||
if (ds != nullptr) {
|
||||
- float rValue = GetDepthBufferRValue(ds->GetCommonTexture()->GetFormatMapping().FormatColor);
|
||||
+ const int32_t vendorId = m_dxvkDevice->adapter()->deviceProperties().vendorID;
|
||||
+ float rValue = GetDepthBufferRValue(ds->GetCommonTexture()->GetFormatMapping().FormatColor, vendorId);
|
||||
if (m_depthBiasScale != rValue) {
|
||||
m_depthBiasScale = rValue;
|
||||
m_flags.set(D3D9DeviceFlag::DirtyDepthBias);
|
||||
@@ -3767,13 +3783,20 @@ namespace dxvk {
|
||||
m_dirtySamplerStates |= 1u << StateSampler;
|
||||
}
|
||||
|
||||
- if (unlikely(m_fetch4Enabled & (1u << StateSampler) && !(m_fetch4 & (1u << StateSampler)))) {
|
||||
- bool textureSupportsFetch4 = newTexture->SupportsFetch4();
|
||||
- if (textureSupportsFetch4
|
||||
- && m_state.samplerStates[StateSampler][D3DSAMP_MAGFILTER] == D3DTEXF_POINT
|
||||
- && m_state.samplerStates[StateSampler][D3DSAMP_MINFILTER] == D3DTEXF_POINT) {
|
||||
+ if (unlikely(m_fetch4Enabled & (1u << StateSampler))) {
|
||||
+ const bool samplerFetch4 = (m_fetch4 & (1u << StateSampler)) != 0;
|
||||
+ const bool pointFilter = m_state.samplerStates[StateSampler][D3DSAMP_MAGFILTER] == D3DTEXF_POINT
|
||||
+ && m_state.samplerStates[StateSampler][D3DSAMP_MINFILTER] == D3DTEXF_POINT;
|
||||
+ const bool textureSupportsFetch4 = newTexture->SupportsFetch4();
|
||||
+
|
||||
+ if (unlikely(textureSupportsFetch4 && pointFilter && !samplerFetch4)) {
|
||||
+ // We're swapping a multi channel texture for a single channel texture => turn on fetch4
|
||||
m_fetch4 |= 1u << StateSampler;
|
||||
m_dirtySamplerStates |= 1u << StateSampler;
|
||||
+ } else if (unlikely(!textureSupportsFetch4 && samplerFetch4)) {
|
||||
+ // We're swapping a single channel texture for a multi channel one => turn off fetch4
|
||||
+ m_fetch4 &= ~(1u << StateSampler);
|
||||
+ m_dirtySamplerStates |= 1u << StateSampler;
|
||||
}
|
||||
}
|
||||
} else if (unlikely(m_fetch4 & (1u << StateSampler))) {
|
||||
@@ -4514,6 +4537,9 @@ namespace dxvk {
|
||||
sliceAlignment = srcTexLevelExtentBlockCount.height * pitch;
|
||||
}
|
||||
|
||||
+
|
||||
+ VkFormat packedFormat = GetPackedDepthStencilFormat(pDestTexture->Desc()->Format);
|
||||
+
|
||||
EmitCs([
|
||||
cSrcSlice = std::move(copySrcSlice),
|
||||
cDstImage = image,
|
||||
@@ -4521,13 +4547,25 @@ namespace dxvk {
|
||||
cDstLevelExtent = alignedExtent,
|
||||
cOffset = alignedDestOffset,
|
||||
cRowAlignment = rowAlignment,
|
||||
- cSliceAlignment = sliceAlignment
|
||||
+ cSliceAlignment = sliceAlignment,
|
||||
+ cPackedFormat = packedFormat
|
||||
] (DxvkContext* ctx) {
|
||||
- ctx->copyBufferToImage(
|
||||
- cDstImage, cDstLayers,
|
||||
- cOffset, cDstLevelExtent,
|
||||
- cSrcSlice.buffer(), cSrcSlice.offset(),
|
||||
- cRowAlignment, cSliceAlignment);
|
||||
+ if (cDstLayers.aspectMask != (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
||||
+ ctx->copyBufferToImage(
|
||||
+ cDstImage, cDstLayers,
|
||||
+ cOffset, cDstLevelExtent,
|
||||
+ cSrcSlice.buffer(), cSrcSlice.offset(),
|
||||
+ cRowAlignment, cSliceAlignment);
|
||||
+ } else {
|
||||
+ ctx->copyPackedBufferToDepthStencilImage(
|
||||
+ cDstImage, cDstLayers,
|
||||
+ VkOffset2D { cOffset.x, cOffset.y },
|
||||
+ VkExtent2D { cDstLevelExtent.width, cDstLevelExtent.height },
|
||||
+ cSrcSlice.buffer(), cSrcSlice.offset(),
|
||||
+ VkOffset2D { 0, 0 },
|
||||
+ VkExtent2D { cDstLevelExtent.width, cDstLevelExtent.height },
|
||||
+ cPackedFormat);
|
||||
+ }
|
||||
});
|
||||
|
||||
TrackTextureMappingBufferSequenceNumber(pSrcTexture, SrcSubresource);
|
||||
@@ -7249,7 +7287,7 @@ namespace dxvk {
|
||||
m_state.streamFreq[i] = 1;
|
||||
|
||||
for (uint32_t i = 0; i < m_state.textures.size(); i++)
|
||||
- TextureChangePrivate(m_state.textures[i], nullptr);
|
||||
+ SetStateTexture(i, nullptr);
|
||||
|
||||
EmitCs([
|
||||
cSize = m_state.textures.size()
|
||||
diff --git a/src/d3d9/d3d9_fixed_function.cpp b/src/d3d9/d3d9_fixed_function.cpp
|
||||
index 37f6e1ab..8ed8062a 100644
|
||||
--- a/src/d3d9/d3d9_fixed_function.cpp
|
||||
+++ b/src/d3d9/d3d9_fixed_function.cpp
|
||||
@@ -596,6 +596,9 @@ namespace dxvk {
|
||||
|
||||
void alphaTestPS();
|
||||
|
||||
+ uint32_t emitMatrixTimesVector(uint32_t rowCount, uint32_t colCount, uint32_t matrix, uint32_t vector);
|
||||
+ uint32_t emitVectorTimesMatrix(uint32_t rowCount, uint32_t colCount, uint32_t vector, uint32_t matrix);
|
||||
+
|
||||
bool isVS() { return m_programType == DxsoProgramType::VertexShader; }
|
||||
bool isPS() { return !isVS(); }
|
||||
|
||||
@@ -805,8 +808,8 @@ namespace dxvk {
|
||||
if (!m_vsKey.Data.Contents.HasPositionT) {
|
||||
if (m_vsKey.Data.Contents.VertexBlendMode == D3D9FF_VertexBlendMode_Normal) {
|
||||
uint32_t blendWeightRemaining = m_module.constf32(1);
|
||||
- uint32_t vtxSum = m_module.constvec4f32(0, 0, 0, 0);
|
||||
- uint32_t nrmSum = m_module.constvec3f32(0, 0, 0);
|
||||
+ uint32_t vtxSum = 0;
|
||||
+ uint32_t nrmSum = 0;
|
||||
|
||||
for (uint32_t i = 0; i <= m_vsKey.Data.Contents.VertexBlendCount; i++) {
|
||||
std::array<uint32_t, 2> arrayIndices;
|
||||
@@ -833,7 +836,7 @@ namespace dxvk {
|
||||
}
|
||||
nrmMtx = m_module.opCompositeConstruct(m_mat3Type, mtxIndices.size(), mtxIndices.data());
|
||||
|
||||
- uint32_t vtxResult = m_module.opVectorTimesMatrix(m_vec4Type, vtx, worldview);
|
||||
+ uint32_t vtxResult = emitVectorTimesMatrix(4, 4, vtx, worldview);
|
||||
uint32_t nrmResult = m_module.opVectorTimesMatrix(m_vec3Type, normal, nrmMtx);
|
||||
|
||||
uint32_t weight;
|
||||
@@ -844,18 +847,26 @@ namespace dxvk {
|
||||
else
|
||||
weight = blendWeightRemaining;
|
||||
|
||||
- vtxResult = m_module.opVectorTimesScalar(m_vec4Type, vtxResult, weight);
|
||||
- nrmResult = m_module.opVectorTimesScalar(m_vec3Type, nrmResult, weight);
|
||||
+ std::array<uint32_t, 4> weightIds = { weight, weight, weight, weight };
|
||||
+ uint32_t weightVec4 = m_module.opCompositeConstruct(m_vec4Type, 4, weightIds.data());
|
||||
+ uint32_t weightVec3 = m_module.opCompositeConstruct(m_vec3Type, 3, weightIds.data());
|
||||
+
|
||||
+ vtxSum = vtxSum
|
||||
+ ? m_module.opFFma(m_vec4Type, vtxResult, weightVec4, vtxSum)
|
||||
+ : m_module.opFMul(m_vec4Type, vtxResult, weightVec4);
|
||||
|
||||
- vtxSum = m_module.opFAdd(m_vec4Type, vtxSum, vtxResult);
|
||||
- nrmSum = m_module.opFAdd(m_vec3Type, nrmSum, nrmResult);
|
||||
+ nrmSum = nrmSum
|
||||
+ ? m_module.opFFma(m_vec3Type, nrmResult, weightVec3, nrmSum)
|
||||
+ : m_module.opFMul(m_vec3Type, nrmResult, weightVec3);
|
||||
+
|
||||
+ m_module.decorate(vtxSum, spv::DecorationNoContraction);
|
||||
}
|
||||
|
||||
vtx = vtxSum;
|
||||
normal = nrmSum;
|
||||
}
|
||||
else {
|
||||
- vtx = m_module.opVectorTimesMatrix(m_vec4Type, vtx, m_vs.constants.worldview);
|
||||
+ vtx = emitVectorTimesMatrix(4, 4, vtx, m_vs.constants.worldview);
|
||||
|
||||
uint32_t nrmMtx = m_vs.constants.normal;
|
||||
|
||||
@@ -883,7 +894,7 @@ namespace dxvk {
|
||||
normal = m_module.opSelect(m_vec3Type, isZeroNormal3, m_module.constvec3f32(0.0f, 0.0f, 0.0f), normal);
|
||||
}
|
||||
|
||||
- gl_Position = m_module.opVectorTimesMatrix(m_vec4Type, vtx, m_vs.constants.proj);
|
||||
+ gl_Position = emitVectorTimesMatrix(4, 4, vtx, m_vs.constants.proj);
|
||||
} else {
|
||||
gl_Position = m_module.opFMul(m_vec4Type, gl_Position, m_vs.constants.invExtent);
|
||||
gl_Position = m_module.opFAdd(m_vec4Type, gl_Position, m_vs.constants.invOffset);
|
||||
@@ -2137,7 +2148,7 @@ namespace dxvk {
|
||||
|
||||
|
||||
void D3D9FFShaderCompiler::emitVsClipping(uint32_t vtx) {
|
||||
- uint32_t worldPos = m_module.opMatrixTimesVector(m_vec4Type, m_vs.constants.inverseView, vtx);
|
||||
+ uint32_t worldPos = emitMatrixTimesVector(4, 4, m_vs.constants.inverseView, vtx);
|
||||
|
||||
uint32_t clipPlaneCountId = m_module.constu32(caps::MaxClipPlanes);
|
||||
|
||||
@@ -2308,6 +2319,38 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
+ uint32_t D3D9FFShaderCompiler::emitMatrixTimesVector(uint32_t rowCount, uint32_t colCount, uint32_t matrix, uint32_t vector) {
|
||||
+ uint32_t f32Type = m_module.defFloatType(32);
|
||||
+ uint32_t vecType = m_module.defVectorType(f32Type, rowCount);
|
||||
+ uint32_t accum = 0;
|
||||
+
|
||||
+ for (uint32_t i = 0; i < colCount; i++) {
|
||||
+ std::array<uint32_t, 4> indices = { i, i, i, i };
|
||||
+
|
||||
+ uint32_t a = m_module.opVectorShuffle(vecType, vector, vector, rowCount, indices.data());
|
||||
+ uint32_t b = m_module.opCompositeExtract(vecType, matrix, 1, &i);
|
||||
+
|
||||
+ accum = accum
|
||||
+ ? m_module.opFFma(vecType, a, b, accum)
|
||||
+ : m_module.opFMul(vecType, a, b);
|
||||
+
|
||||
+ m_module.decorate(accum, spv::DecorationNoContraction);
|
||||
+ }
|
||||
+
|
||||
+ return accum;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ uint32_t D3D9FFShaderCompiler::emitVectorTimesMatrix(uint32_t rowCount, uint32_t colCount, uint32_t vector, uint32_t matrix) {
|
||||
+ uint32_t f32Type = m_module.defFloatType(32);
|
||||
+ uint32_t vecType = m_module.defVectorType(f32Type, colCount);
|
||||
+ uint32_t matType = m_module.defMatrixType(vecType, rowCount);
|
||||
+
|
||||
+ matrix = m_module.opTranspose(matType, matrix);
|
||||
+ return emitMatrixTimesVector(colCount, rowCount, matrix, vector);
|
||||
+ }
|
||||
+
|
||||
+
|
||||
D3D9FFShader::D3D9FFShader(
|
||||
D3D9DeviceEx* pDevice,
|
||||
const D3D9FFShaderKeyVS& Key) {
|
||||
diff --git a/src/d3d9/d3d9_query.cpp b/src/d3d9/d3d9_query.cpp
|
||||
index 7ce47cf9..a4873252 100644
|
||||
--- a/src/d3d9/d3d9_query.cpp
|
||||
+++ b/src/d3d9/d3d9_query.cpp
|
||||
@@ -101,8 +101,10 @@ namespace dxvk {
|
||||
|
||||
if (dwIssueFlags == D3DISSUE_BEGIN) {
|
||||
if (QueryBeginnable(m_queryType)) {
|
||||
- if (m_state == D3D9_VK_QUERY_BEGUN && QueryEndable(m_queryType))
|
||||
+ if (m_state == D3D9_VK_QUERY_BEGUN && QueryEndable(m_queryType)) {
|
||||
+ m_resetCtr.fetch_add(1, std::memory_order_acquire);
|
||||
m_parent->End(this);
|
||||
+ }
|
||||
|
||||
m_parent->Begin(this);
|
||||
|
||||
diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp
|
||||
index 306a79b7..29e3b6eb 100644
|
||||
--- a/src/d3d9/d3d9_swapchain.cpp
|
||||
+++ b/src/d3d9/d3d9_swapchain.cpp
|
||||
@@ -215,6 +215,11 @@ namespace dxvk {
|
||||
|
||||
|
||||
D3D9SwapChainEx::~D3D9SwapChainEx() {
|
||||
+ // Avoids hanging when in this state, see comment
|
||||
+ // in DxvkDevice::~DxvkDevice.
|
||||
+ if (this_thread::isInModuleDetachment())
|
||||
+ return;
|
||||
+
|
||||
DestroyBackBuffers();
|
||||
|
||||
ResetWindowProc(m_window);
|
||||
@@ -953,7 +958,6 @@ namespace dxvk {
|
||||
presenterDesc);
|
||||
|
||||
m_presenter->setFrameRateLimit(m_parent->GetOptions()->maxFrameRate);
|
||||
- m_presenter->setFrameRateLimiterRefreshRate(m_displayRefreshRate);
|
||||
|
||||
CreateRenderTargetViews();
|
||||
}
|
||||
@@ -1177,9 +1181,6 @@ namespace dxvk {
|
||||
void D3D9SwapChainEx::NotifyDisplayRefreshRate(
|
||||
double RefreshRate) {
|
||||
m_displayRefreshRate = RefreshRate;
|
||||
-
|
||||
- if (m_presenter != nullptr)
|
||||
- m_presenter->setFrameRateLimiterRefreshRate(RefreshRate);
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/d3d9/d3d9_util.h b/src/d3d9/d3d9_util.h
|
||||
index 5899cd4c..aea73e6d 100644
|
||||
--- a/src/d3d9/d3d9_util.h
|
||||
+++ b/src/d3d9/d3d9_util.h
|
||||
@@ -176,14 +176,14 @@ namespace dxvk {
|
||||
|
||||
void ConvertRect(RECT rect, VkOffset2D& offset, VkExtent2D& extent);
|
||||
|
||||
- inline float GetDepthBufferRValue(VkFormat Format) {
|
||||
+ inline float GetDepthBufferRValue(VkFormat Format, int32_t vendorId) {
|
||||
switch (Format) {
|
||||
case VK_FORMAT_D16_UNORM_S8_UINT:
|
||||
case VK_FORMAT_D16_UNORM:
|
||||
- return float(1 << 16);
|
||||
+ return vendorId == 0x10de ? float(1 << 15) : float(1 << 16);
|
||||
|
||||
case VK_FORMAT_D24_UNORM_S8_UINT:
|
||||
- return float(1 << 24);
|
||||
+ return vendorId == 0x10de ? float(1 << 23) : float(1 << 24);
|
||||
|
||||
default:
|
||||
case VK_FORMAT_D32_SFLOAT_S8_UINT:
|
||||
diff --git a/src/dxbc/dxbc_chunk_isgn.cpp b/src/dxbc/dxbc_chunk_isgn.cpp
|
||||
index ce6617bd..47f4eef4 100644
|
||||
--- a/src/dxbc/dxbc_chunk_isgn.cpp
|
||||
+++ b/src/dxbc/dxbc_chunk_isgn.cpp
|
||||
@@ -99,13 +99,21 @@ namespace dxvk {
|
||||
|
||||
|
||||
bool DxbcIsgn::compareSemanticNames(
|
||||
- const std::string& a, const std::string& b) const {
|
||||
+ const std::string& a, const std::string& b) {
|
||||
if (a.size() != b.size())
|
||||
return false;
|
||||
|
||||
for (size_t i = 0; i < a.size(); i++) {
|
||||
- if (std::toupper(a[i]) != std::toupper(b[i]))
|
||||
- return false;
|
||||
+ char ac = a[i];
|
||||
+ char bc = b[i];
|
||||
+
|
||||
+ if (ac != bc) {
|
||||
+ if (ac >= 'A' && ac <= 'Z') ac += 'a' - 'A';
|
||||
+ if (bc >= 'A' && bc <= 'Z') bc += 'a' - 'A';
|
||||
+
|
||||
+ if (ac != bc)
|
||||
+ return false;
|
||||
+ }
|
||||
}
|
||||
|
||||
return true;
|
||||
diff --git a/src/dxbc/dxbc_chunk_isgn.h b/src/dxbc/dxbc_chunk_isgn.h
|
||||
index 030372f3..1dce64ad 100644
|
||||
--- a/src/dxbc/dxbc_chunk_isgn.h
|
||||
+++ b/src/dxbc/dxbc_chunk_isgn.h
|
||||
@@ -56,14 +56,14 @@ namespace dxvk {
|
||||
|
||||
void printEntries() const;
|
||||
|
||||
+ static bool compareSemanticNames(
|
||||
+ const std::string& a,
|
||||
+ const std::string& b);
|
||||
+
|
||||
private:
|
||||
|
||||
std::vector<DxbcSgnEntry> m_entries;
|
||||
|
||||
- bool compareSemanticNames(
|
||||
- const std::string& a,
|
||||
- const std::string& b) const;
|
||||
-
|
||||
};
|
||||
|
||||
}
|
||||
diff --git a/src/dxgi/dxgi_swapchain_dispatcher.h b/src/dxgi/dxgi_swapchain_dispatcher.h
|
||||
index 4ef50d04..c8a503b3 100644
|
||||
--- a/src/dxgi/dxgi_swapchain_dispatcher.h
|
||||
+++ b/src/dxgi/dxgi_swapchain_dispatcher.h
|
||||
@@ -224,7 +224,9 @@ namespace dxvk {
|
||||
HRESULT STDMETHODCALLTYPE SetFullscreenState(
|
||||
BOOL Fullscreen,
|
||||
IDXGIOutput* pTarget) final {
|
||||
- return m_dispatch->SetFullscreenState(Fullscreen, pTarget);
|
||||
+ if (likely(m_dispatch != nullptr))
|
||||
+ return m_dispatch->SetFullscreenState(Fullscreen, pTarget);
|
||||
+ return S_OK;
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/dxso/dxso_compiler.cpp b/src/dxso/dxso_compiler.cpp
|
||||
index b68608a0..7cd6f72b 100644
|
||||
--- a/src/dxso/dxso_compiler.cpp
|
||||
+++ b/src/dxso/dxso_compiler.cpp
|
||||
@@ -702,7 +702,7 @@ namespace dxvk {
|
||||
const bool pixel = m_programInfo.type() == DxsoProgramTypes::PixelShader;
|
||||
const bool vertex = !pixel;
|
||||
|
||||
- if (pixel && input && semantic.usage == DxsoUsage::Color && m_programInfo.majorVersion() < 3)
|
||||
+ if (pixel && input && semantic.usage == DxsoUsage::Color)
|
||||
centroid = true;
|
||||
|
||||
uint32_t slot = 0;
|
||||
@@ -1508,14 +1508,11 @@ namespace dxvk {
|
||||
if (m_moduleInfo.options.d3d9FloatEmulation != D3D9FloatEmulation::Strict)
|
||||
return {x.type, m_module.opFMix(typeId, x.id, y.id, a.id)};
|
||||
|
||||
- uint32_t oneId = m_module.constfReplicant(1.0f, a.type.ccount);
|
||||
+ DxsoRegisterValue ySubx;
|
||||
+ ySubx.type = x.type;
|
||||
+ ySubx.id = m_module.opFSub(typeId, y.id, x.id);
|
||||
|
||||
- DxsoRegisterValue revA;
|
||||
- revA.type = a.type;
|
||||
- revA.id = m_module.opFSub(typeId, oneId, a.id);
|
||||
-
|
||||
- DxsoRegisterValue xRevA = emitMul(x, revA);
|
||||
- return emitFma(a, y, xRevA);
|
||||
+ return emitFma(a, ySubx, x);
|
||||
}
|
||||
|
||||
|
||||
@@ -2123,18 +2120,18 @@ namespace dxvk {
|
||||
DxsoRegMask srcMask(true, true, true, false);
|
||||
auto vec3 = emitRegisterLoad(src[0], srcMask);
|
||||
|
||||
- DxsoRegisterValue dot = emitDot(vec3, vec3);
|
||||
- dot.id = m_module.opInverseSqrt (scalarTypeId, dot.id);
|
||||
+ // No need for emitDot, either both arguments or none are zero.
|
||||
+ // mul_zero has the same result as ieee mul.
|
||||
+ uint32_t dot = m_module.opDot(scalarTypeId, vec3.id, vec3.id);
|
||||
+ DxsoRegisterValue rcpLength;
|
||||
+ rcpLength.type = scalarType;
|
||||
+ rcpLength.id = m_module.opInverseSqrt(scalarTypeId, dot);
|
||||
if (m_moduleInfo.options.d3d9FloatEmulation == D3D9FloatEmulation::Enabled) {
|
||||
- dot.id = m_module.opNMin (scalarTypeId, dot.id,
|
||||
- m_module.constf32(FLT_MAX));
|
||||
+ rcpLength.id = m_module.opNMin(scalarTypeId, rcpLength.id, m_module.constf32(FLT_MAX));
|
||||
}
|
||||
|
||||
- // r * rsq(r . r);
|
||||
- result.id = m_module.opVectorTimesScalar(
|
||||
- typeId,
|
||||
- emitRegisterLoad(src[0], mask).id,
|
||||
- dot.id);
|
||||
+ // r * rsq(r . r)
|
||||
+ result.id = emitMul(emitRegisterLoad(src[0], mask), emitRegisterExtend(rcpLength, mask.popCount())).id;
|
||||
break;
|
||||
}
|
||||
case DxsoOpcode::SinCos: {
|
||||
diff --git a/src/dxvk/dxvk_device.cpp b/src/dxvk/dxvk_device.cpp
|
||||
index dc12ab47..efe8354e 100644
|
||||
--- a/src/dxvk/dxvk_device.cpp
|
||||
+++ b/src/dxvk/dxvk_device.cpp
|
||||
@@ -26,6 +26,13 @@ namespace dxvk {
|
||||
|
||||
|
||||
DxvkDevice::~DxvkDevice() {
|
||||
+ // If we are being destroyed during/after DLL process detachment
|
||||
+ // from TerminateProcess, etc, our CS threads are already destroyed
|
||||
+ // and we cannot synchronize against them.
|
||||
+ // The best we can do is just wait for the Vulkan device to be idle.
|
||||
+ if (this_thread::isInModuleDetachment())
|
||||
+ return;
|
||||
+
|
||||
// Wait for all pending Vulkan commands to be
|
||||
// executed before we destroy any resources.
|
||||
this->waitForIdle();
|
||||
diff --git a/src/dxvk/dxvk_fence.h b/src/dxvk/dxvk_fence.h
|
||||
index 79745286..f070595d 100644
|
||||
--- a/src/dxvk/dxvk_fence.h
|
||||
+++ b/src/dxvk/dxvk_fence.h
|
||||
@@ -97,7 +97,7 @@ namespace dxvk {
|
||||
|
||||
struct QueueItem {
|
||||
QueueItem() { }
|
||||
- QueueItem(uint32_t v, DxvkFenceEvent&& e)
|
||||
+ QueueItem(uint64_t v, DxvkFenceEvent&& e)
|
||||
: value(v), event(std::move(e)) { }
|
||||
|
||||
uint64_t value;
|
||||
diff --git a/src/util/config/config.cpp b/src/util/config/config.cpp
|
||||
index 860debfe..1da49ab8 100644
|
||||
--- a/src/util/config/config.cpp
|
||||
+++ b/src/util/config/config.cpp
|
||||
@@ -30,6 +30,12 @@ namespace dxvk {
|
||||
/* The Vanishing of Ethan Carter Redux */
|
||||
{ R"(\\EthanCarter-Win64-Shipping\.exe$)", {{
|
||||
{ "dxgi.customVendorId", "10de" },
|
||||
+ }} },
|
||||
+ /* EVE Online: Needs this to expose D3D12 *
|
||||
+ * otherwise D3D12 option on launcher is *
|
||||
+ * greyed out */
|
||||
+ { R"(\\evelauncher\.exe$)", {{
|
||||
+ { "d3d11.maxFeatureLevel", "12_1" },
|
||||
}} },
|
||||
/* The Evil Within: Submits command lists *
|
||||
* multiple times */
|
||||
@@ -134,7 +140,7 @@ namespace dxvk {
|
||||
{ "dxgi.customVendorId", "10de" },
|
||||
}} },
|
||||
/* Modern Warfare Remastered */
|
||||
- { R"(\\h1_[ms]p64_ship\.exe$)", {{
|
||||
+ { R"(\\h1(_[ms]p64_ship|-mod)\.exe$)", {{
|
||||
{ "dxgi.customVendorId", "10de" },
|
||||
}} },
|
||||
/* Titan Quest */
|
||||
@@ -258,6 +264,10 @@ namespace dxvk {
|
||||
* use of 4x MSAA throughout the renderer */
|
||||
{ R"(\\WOFF\.exe$)", {{
|
||||
{ "d3d11.disableMsaa", "True" },
|
||||
+ }} },
|
||||
+ /* Mary Skelter 2 - Broken MSAA */
|
||||
+ { R"(\\MarySkelter2\.exe$)", {{
|
||||
+ { "d3d11.disableMsaa", "True" },
|
||||
}} },
|
||||
/* Final Fantasy XIV - Stuttering on NV */
|
||||
{ R"(\\ffxiv_dx11\.exe$)", {{
|
||||
@@ -311,6 +321,41 @@ namespace dxvk {
|
||||
{ R"(\\Stray-Win64-Shipping\.exe$)", {{
|
||||
{ "d3d11.ignoreGraphicsBarriers", "True" },
|
||||
}} },
|
||||
+ /* Metal Gear Solid V: Ground Zeroes *
|
||||
+ * Texture quality can break at high vram */
|
||||
+ { R"(\\MgsGroundZeroes\.exe$)", {{
|
||||
+ { "dxgi.maxDeviceMemory", "4095" },
|
||||
+ }} },
|
||||
+ /* Shantae and the Pirate's Curse *
|
||||
+ * Game speeds up above 60 fps */
|
||||
+ { R"(\\ShantaeCurse\.exe$)", {{
|
||||
+ { "dxgi.maxFrameRate", "60" },
|
||||
+ }} },
|
||||
+ /* Mighty Switch Force! Collection *
|
||||
+ * Games speed up above 60 fps */
|
||||
+ { R"(\\MSFC\.exe$)", {{
|
||||
+ { "dxgi.maxFrameRate", "60" },
|
||||
+ }} },
|
||||
+ /* Cardfight!! Vanguard Dear Days: *
|
||||
+ * Submits command lists multiple times */
|
||||
+ { R"(\\VG2\.exe$)", {{
|
||||
+ { "d3d11.dcSingleUseMode", "False" },
|
||||
+ }} },
|
||||
+ /* Battlefield: Bad Company 2 *
|
||||
+ * Gets rid of black flickering */
|
||||
+ { R"(\\BFBC2Game\.exe$)", {{
|
||||
+ { "d3d11.floatControls", "False" },
|
||||
+ }} },
|
||||
+ /* Sonic Frontiers - flickering shadows and *
|
||||
+ * vegetation when GPU-bound */
|
||||
+ { R"(\\SonicFrontiers\.exe$)", {{
|
||||
+ { "dxgi.maxFrameLatency", "1" },
|
||||
+ }} },
|
||||
+ /* TRAHA Global *
|
||||
+ * Shadow issues when it sees AMD/Nvidia */
|
||||
+ { R"(\\RapaNui-Win64-Shipping\.exe$)", {{
|
||||
+ { "dxgi.customVendorId", "8086" },
|
||||
+ }} },
|
||||
|
||||
/**********************************************/
|
||||
/* D3D9 GAMES */
|
||||
@@ -341,6 +386,7 @@ namespace dxvk {
|
||||
/* Sonic Adventure 2 */
|
||||
{ R"(\\Sonic Adventure 2\\(launcher|sonic2app)\.exe$)", {{
|
||||
{ "d3d9.floatEmulation", "Strict" },
|
||||
+ { "d3d9.maxFrameRate", "60" },
|
||||
}} },
|
||||
/* The Sims 2,
|
||||
Body Shop,
|
||||
@@ -431,10 +477,14 @@ namespace dxvk {
|
||||
}} },
|
||||
/* GTA IV (NVAPI) */
|
||||
/* Also thinks we're always on Intel *
|
||||
- * and will report/use bad amounts of VRAM. */
|
||||
- { R"(\\GTAIV\.exe$)", {{
|
||||
+ * and will report/use bad amounts of VRAM.
|
||||
+ * Disabling support for DF texture formats
|
||||
+ * makes the game use a better looking render
|
||||
+ * path for mirrors */
|
||||
+ { R"(\\(GTAIV|EFLC)\.exe$)", {{
|
||||
{ "d3d9.customVendorId", "1002" },
|
||||
{ "dxgi.emulateUMA", "True" },
|
||||
+ { "d3d9.supportDFFormats", "False" },
|
||||
}} },
|
||||
/* Battlefield 2 (bad z-pass) */
|
||||
{ R"(\\BF2\.exe$)", {{
|
||||
@@ -558,6 +608,11 @@ namespace dxvk {
|
||||
{ R"(\\spv3\.exe$)", {{
|
||||
{ "d3d9.shaderModel", "1" },
|
||||
}} },
|
||||
+ /* Escape from Tarkov launcher
|
||||
+ Same issue as Warhammer: RoR above */
|
||||
+ { R"(\\BsgLauncher\.exe$)", {{
|
||||
+ { "d3d9.shaderModel", "1" },
|
||||
+ }} },
|
||||
/* Star Wars The Force Unleashed 2 *
|
||||
* Black particles because it tries to bind *
|
||||
* a 2D texture for a shader that *
|
||||
@@ -585,9 +640,11 @@ namespace dxvk {
|
||||
{ "d3d9.customVendorId", "10de" },
|
||||
}} },
|
||||
/* Beyond Good And Evil *
|
||||
- * Fixes missing sun and light shafts */
|
||||
+ * Fixes missing sun and light shafts *
|
||||
+ * UI breaks at high fps */
|
||||
{ R"(\\BGE\.exe$)", {{
|
||||
- { "d3d9.allowDoNotWait", "False" },
|
||||
+ { "d3d9.allowDoNotWait", "False" },
|
||||
+ { "d3d9.maxFrameRate", "60" },
|
||||
}} },
|
||||
/* Supreme Commander & Forged Alliance Forever */
|
||||
{ R"(\\(SupremeCommander|ForgedAlliance)\.exe$)", {{
|
||||
@@ -616,11 +673,66 @@ namespace dxvk {
|
||||
{ R"(\\NinjaBlade\.exe$)", {{
|
||||
{ "d3d9.alphaTestWiggleRoom", "True" },
|
||||
}} },
|
||||
+ /* King Of Fighters XIII *
|
||||
+ * In-game speed increases on high FPS */
|
||||
+ { R"(\\kofxiii\.exe$)", {{
|
||||
+ { "d3d9.maxFrameRate", "60" },
|
||||
+ }} },
|
||||
/* YS Origin *
|
||||
* Helps very bad frametimes in some areas */
|
||||
{ R"(\\yso_win\.exe$)", {{
|
||||
{ "d3d9.maxFrameLatency", "1" },
|
||||
}} },
|
||||
+ /* Heroes of Annihilated Empires *
|
||||
+ * Has issues with texture rendering and *
|
||||
+ * video memory detection otherwise. */
|
||||
+ { R"(\\Heroes (o|O)f Annihilated Empires.*\\engine\.exe$)", {{
|
||||
+ { "d3d9.memoryTrackTest", "True" },
|
||||
+ { "d3d9.maxAvailableMemory", "2048" },
|
||||
+ }} },
|
||||
+ /* The Ship (2004) */
|
||||
+ { R"(\\ship\.exe$)", {{
|
||||
+ { "d3d9.memoryTrackTest", "True" },
|
||||
+ }} },
|
||||
+ /* SiN Episodes Emergence */
|
||||
+ { R"(\\SinEpisodes\.exe$)", {{
|
||||
+ { "d3d9.memoryTrackTest", "True" },
|
||||
+ }} },
|
||||
+ /* Witcher 1: Very long loading times */
|
||||
+ { R"(\\witcher\.exe$)", {{
|
||||
+ { "d3d9.apitraceMode", "True" },
|
||||
+ }} },
|
||||
+ /* Hammer World Editor */
|
||||
+ { R"(\\(hammer(plusplus)?|mallet|wc)\.exe$)", {{
|
||||
+ { "d3d9.apitraceMode", "True" },
|
||||
+ }} },
|
||||
+ /* Fallout 3 - Doesn't like Intel Id */
|
||||
+ { R"(\\Fallout3\.exe$)", {{
|
||||
+ { "d3d9.customVendorId", "10de" },
|
||||
+ }} },
|
||||
+ /* Sonic & All-Stars Racing Transformed *
|
||||
+ * Helps performance when Resizable BAR *
|
||||
+ * is enabled */
|
||||
+ { R"(\\ASN_App_PcDx9_Final\.exe$)", {{
|
||||
+ { "d3d9.apitraceMode", "True" },
|
||||
+ }} },
|
||||
+ /* Black Mesa *
|
||||
+ * Artifacts & broken flashlight on Intel */
|
||||
+ { R"(\\bms\.exe$)", {{
|
||||
+ { "d3d9.customVendorId", "10de" },
|
||||
+ }} },
|
||||
+ /* Secret World Legends launcher *
|
||||
+ * Invisible UI */
|
||||
+ { R"(\\Secret World Legends\\ClientPatcher\.exe$)", {{
|
||||
+ { "d3d9.shaderModel", "2" },
|
||||
+ }} },
|
||||
+ /* Alien Rage *
|
||||
+ * GTX 295 & disable Hack to fix shadows */
|
||||
+ { R"(\\(ShippingPC-AFEARGame|ARageMP)\.exe$)", {{
|
||||
+ { "d3d9.customVendorId", "10de" },
|
||||
+ { "d3d9.customDeviceId", "05E0" },
|
||||
+ { "dxgi.nvapiHack", "False" },
|
||||
+ }} },
|
||||
}};
|
||||
|
||||
|
||||
diff --git a/src/util/thread.cpp b/src/util/thread.cpp
|
||||
index eed45d34..044ae696 100644
|
||||
--- a/src/util/thread.cpp
|
||||
+++ b/src/util/thread.cpp
|
||||
@@ -3,7 +3,22 @@
|
||||
|
||||
#include <atomic>
|
||||
|
||||
-#ifndef _WIN32
|
||||
+#ifdef _WIN32
|
||||
+
|
||||
+namespace dxvk::this_thread {
|
||||
+
|
||||
+ bool isInModuleDetachment() {
|
||||
+ using PFN_RtlDllShutdownInProgress = BOOLEAN (WINAPI *)();
|
||||
+
|
||||
+ static auto RtlDllShutdownInProgress = reinterpret_cast<PFN_RtlDllShutdownInProgress>(
|
||||
+ ::GetProcAddress(::GetModuleHandleW(L"ntdll.dll"), "RtlDllShutdownInProgress"));
|
||||
+
|
||||
+ return RtlDllShutdownInProgress();
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
|
||||
namespace dxvk::this_thread {
|
||||
|
||||
diff --git a/src/util/thread.h b/src/util/thread.h
|
||||
index bc58d229..41750a99 100644
|
||||
--- a/src/util/thread.h
|
||||
+++ b/src/util/thread.h
|
||||
@@ -153,6 +153,8 @@ namespace dxvk {
|
||||
inline uint32_t get_id() {
|
||||
return uint32_t(GetCurrentThreadId());
|
||||
}
|
||||
+
|
||||
+ bool isInModuleDetachment();
|
||||
}
|
||||
|
||||
|
||||
@@ -341,6 +343,10 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
uint32_t get_id();
|
||||
+
|
||||
+ inline bool isInModuleDetachment() {
|
||||
+ return false;
|
||||
+ }
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/src/util/util_fps_limiter.cpp b/src/util/util_fps_limiter.cpp
|
||||
index 7716500b..da980002 100644
|
||||
--- a/src/util/util_fps_limiter.cpp
|
||||
+++ b/src/util/util_fps_limiter.cpp
|
||||
@@ -42,28 +42,12 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
- void FpsLimiter::setDisplayRefreshRate(double refreshRate) {
|
||||
- std::lock_guard<dxvk::mutex> lock(m_mutex);
|
||||
-
|
||||
- m_refreshInterval = refreshRate > 0.0
|
||||
- ? NtTimerDuration(int64_t(double(NtTimerDuration::period::den) / refreshRate))
|
||||
- : NtTimerDuration::zero();
|
||||
- }
|
||||
-
|
||||
-
|
||||
void FpsLimiter::delay(bool vsyncEnabled) {
|
||||
std::lock_guard<dxvk::mutex> lock(m_mutex);
|
||||
|
||||
if (!isEnabled())
|
||||
return;
|
||||
|
||||
- // If the swap chain is known to have vsync enabled and the
|
||||
- // refresh rate is similar to the target frame rate, disable
|
||||
- // the limiter so it does not screw up frame times
|
||||
- if (vsyncEnabled && !m_envOverride
|
||||
- && m_refreshInterval * 100 > m_targetInterval * 97)
|
||||
- return;
|
||||
-
|
||||
auto t0 = m_lastFrame;
|
||||
auto t1 = dxvk::high_resolution_clock::now();
|
||||
|
||||
diff --git a/src/util/util_fps_limiter.h b/src/util/util_fps_limiter.h
|
||||
index 9601dc96..3fca509c 100644
|
||||
--- a/src/util/util_fps_limiter.h
|
||||
+++ b/src/util/util_fps_limiter.h
|
||||
@@ -28,16 +28,6 @@ namespace dxvk {
|
||||
*/
|
||||
void setTargetFrameRate(double frameRate);
|
||||
|
||||
- /**
|
||||
- * \brief Sets display refresh rate
|
||||
- *
|
||||
- * This information is used to decide whether or not
|
||||
- * the limiter should be active in the first place in
|
||||
- * case vertical synchronization is enabled.
|
||||
- * \param [in] refreshRate Current refresh rate
|
||||
- */
|
||||
- void setDisplayRefreshRate(double refreshRate);
|
||||
-
|
||||
/**
|
||||
* \brief Stalls calling thread as necessary
|
||||
*
|
||||
@@ -68,7 +58,6 @@ namespace dxvk {
|
||||
dxvk::mutex m_mutex;
|
||||
|
||||
NtTimerDuration m_targetInterval = NtTimerDuration::zero();
|
||||
- NtTimerDuration m_refreshInterval = NtTimerDuration::zero();
|
||||
NtTimerDuration m_deviation = NtTimerDuration::zero();
|
||||
TimePoint m_lastFrame;
|
||||
|
||||
diff --git a/src/vulkan/vulkan_presenter.cpp b/src/vulkan/vulkan_presenter.cpp
|
||||
index b02869e3..880f662d 100644
|
||||
--- a/src/vulkan/vulkan_presenter.cpp
|
||||
+++ b/src/vulkan/vulkan_presenter.cpp
|
||||
@@ -248,11 +248,6 @@ namespace dxvk::vk {
|
||||
}
|
||||
|
||||
|
||||
- void Presenter::setFrameRateLimiterRefreshRate(double refreshRate) {
|
||||
- m_fpsLimiter.setDisplayRefreshRate(refreshRate);
|
||||
- }
|
||||
-
|
||||
-
|
||||
VkResult Presenter::getSupportedFormats(std::vector<VkSurfaceFormatKHR>& formats, const PresenterDesc& desc) {
|
||||
uint32_t numFormats = 0;
|
||||
|
||||
diff --git a/src/vulkan/vulkan_presenter.h b/src/vulkan/vulkan_presenter.h
|
||||
index 40562f6e..8df19ea9 100644
|
||||
--- a/src/vulkan/vulkan_presenter.h
|
||||
+++ b/src/vulkan/vulkan_presenter.h
|
||||
@@ -161,16 +161,6 @@ namespace dxvk::vk {
|
||||
*/
|
||||
void setFrameRateLimit(double frameRate);
|
||||
|
||||
- /**
|
||||
- * \brief Notifies frame rate limiter about the display refresh rate
|
||||
- *
|
||||
- * Used to dynamically disable the frame rate limiter in case
|
||||
- * vertical synchronization is used and the target frame rate
|
||||
- * roughly equals the display's refresh rate.
|
||||
- * \param [in] refresnRate Current refresh rate
|
||||
- */
|
||||
- void setFrameRateLimiterRefreshRate(double refreshRate);
|
||||
-
|
||||
/**
|
||||
* \brief Checks whether a Vulkan swap chain exists
|
||||
*
|
||||
3
sources
3
sources
|
|
@ -1 +1,2 @@
|
|||
SHA512 (dxvk-1.10.3.tar.gz) = 8995b231b3f3650beda04c01f30186d10a373075a4774b4ecbfb3bbeb4de99c57555f1db0611e5c61c6a411a7215e0faf228f9861f6b7adae6fc365e8056f7e3
|
||||
SHA512 (dxvk-2.7.1.tar.gz) = 4d8c580d6e7a4e1a3438ec60fa323c5af002a3ea2f6dc4f049832ee6cbae34177623c373ab3d3f720be3149ce3cffb5b91da5892c1bdfe22c1e86bb9dde071ca
|
||||
SHA512 (libdisplay-info-275e645.tar.gz) = 4816510f1d92d3e4ca266d29a9fbe583e9ef65af44ee2050e0b575661c1ff0ebcfb84cc499c4fdc594e0fde7261f946ca8748207b29af920605174f45ced260e
|
||||
|
|
|
|||
143
wine-dxvk.spec
143
wine-dxvk.spec
|
|
@ -1,35 +1,27 @@
|
|||
%global debug_package %{nil}
|
||||
%{?mingw_package_header}
|
||||
|
||||
%ifarch x86_64
|
||||
# _libdir was restructured in F42 wine package to support a directory/symlink replacement
|
||||
%global _libdir %{_libdir}/wine-wow64
|
||||
|
||||
%global libdisplay_commit 275e6459c7ab1ddd4b125f28d0440716e4888078
|
||||
%global libdisplay_shortcommit %(c=%{libdisplay_commit}; echo ${c:0:7})
|
||||
|
||||
%global winepedir x86_64-windows
|
||||
%global target_x86_type 64
|
||||
%global mingw_sysroot %mingw64_sysroot
|
||||
%global mingw_build_win64 1
|
||||
%global mingw_build_win32 0
|
||||
%else
|
||||
%global winepedir i386-windows
|
||||
%global target_x86_type 32
|
||||
%global mingw_sysroot %mingw32_sysroot
|
||||
%global mingw_build_win64 0
|
||||
%global mingw_build_win32 1
|
||||
%endif
|
||||
|
||||
Name: wine-dxvk
|
||||
Version: 1.10.3
|
||||
Version: 2.7.1
|
||||
Release: %autorelease
|
||||
Summary: Vulkan-based D3D11 and D3D10 implementation for Linux / Wine
|
||||
Summary: Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine
|
||||
|
||||
License: zlib
|
||||
License: zlib AND MIT
|
||||
URL: https://github.com/doitsujin/dxvk
|
||||
Source0: %{url}/archive/v%{version}/dxvk-%{version}.tar.gz
|
||||
|
||||
# Apply fixes from git/1.10.x released after 1.10.3 till 2nd of Aug 2023
|
||||
Patch01: postrel_fixxes.patch
|
||||
|
||||
# GCC 13 buildfixes
|
||||
# https://github.com/doitsujin/dxvk/pull/3308
|
||||
Patch02: 3308.patch
|
||||
Source1: https://gitlab.freedesktop.org/frog/libdisplay-info/-/archive/%{libdisplay_commit}/libdisplay-info-%{libdisplay_shortcommit}.tar.gz
|
||||
|
||||
BuildRequires: gcc
|
||||
BuildRequires: gcc-c++
|
||||
|
|
@ -37,7 +29,6 @@ BuildRequires: glslang
|
|||
BuildRequires: meson
|
||||
BuildRequires: wine-devel
|
||||
|
||||
%ifarch x86_64
|
||||
BuildRequires: mingw64-filesystem
|
||||
BuildRequires: mingw64-binutils
|
||||
BuildRequires: mingw64-headers
|
||||
|
|
@ -45,43 +36,36 @@ BuildRequires: mingw64-cpp
|
|||
BuildRequires: mingw64-gcc
|
||||
BuildRequires: mingw64-gcc-c++
|
||||
BuildRequires: mingw64-winpthreads-static
|
||||
%else
|
||||
BuildRequires: mingw32-filesystem
|
||||
BuildRequires: mingw32-binutils
|
||||
BuildRequires: mingw32-headers
|
||||
BuildRequires: mingw32-cpp
|
||||
BuildRequires: mingw32-gcc
|
||||
BuildRequires: mingw32-gcc-c++
|
||||
BuildRequires: mingw32-winpthreads-static
|
||||
%endif
|
||||
BuildRequires: mingw64-vulkan-headers
|
||||
BuildRequires: mingw64-spirv-headers
|
||||
|
||||
Requires(pre): vulkan-tools
|
||||
|
||||
Requires: wine-core%{?_isa} >= 6.8
|
||||
Recommends: wine-dxvk-dxgi%{?_isa} = %{version}-%{release}
|
||||
Requires: wine-core%{?_isa}
|
||||
Requires: wine-dxvk-dxgi%{?_isa} = %{version}-%{release}
|
||||
Requires: vulkan-loader%{?_isa}
|
||||
|
||||
# We want x86_64 users to always have also 32 bit lib, it's the same what wine does
|
||||
%ifarch x86_64
|
||||
Requires: wine-dxvk(x86-32) = %{version}-%{release}
|
||||
%endif
|
||||
Obsoletes: wine-dxvk.i686 <= 2.6.2-1
|
||||
|
||||
# Recommend also the d3d9 (former D9VK)
|
||||
Recommends: wine-dxvk-d3d9%{?_isa} = %{version}-%{release}
|
||||
# Recommend also d3d8, d3d9, and d3d10
|
||||
Recommends: wine-dxvk-d3d8%{?_isa} = %{version}-%{release}
|
||||
Recommends: wine-dxvk-d3d9%{?_isa} = %{version}-%{release}
|
||||
Recommends: wine-dxvk-d3d10%{?_isa} = %{version}-%{release}
|
||||
|
||||
Requires(posttrans): %{_sbindir}/alternatives wine-core%{?_isa} >= 6.8
|
||||
Requires(posttrans): %{_sbindir}/alternatives wine-core%{?_isa}
|
||||
Requires(preun): %{_sbindir}/alternatives
|
||||
|
||||
ExclusiveArch: %{ix86} x86_64
|
||||
ExclusiveArch: x86_64
|
||||
|
||||
Provides: bundled(libdisplay-info) = 0.3.0~dev^git%{libdisplay_shortcommit}
|
||||
|
||||
%description
|
||||
%{summary}
|
||||
|
||||
%package dxgi
|
||||
Summary: DXVK DXGI implementation
|
||||
%ifarch x86_64
|
||||
Requires: wine-dxvk-dxgi(x86-32) = %{version}-%{release}
|
||||
%endif
|
||||
|
||||
Obsoletes: wine-dxvk-dxgi.i686 <= 2.6.2-1
|
||||
|
||||
%description dxgi
|
||||
%{summary}
|
||||
|
|
@ -89,21 +73,39 @@ Requires: wine-dxvk-dxgi(x86-32) = %{version}-%{release}
|
|||
This package doesn't enable the use of this DXGI implementation,
|
||||
it should be installed and overridden per prefix.
|
||||
|
||||
%package d3d10
|
||||
Summary: DXVK D3D10 implementation
|
||||
|
||||
Requires: wine-dxvk%{?_isa} = %{version}-%{release}
|
||||
|
||||
Obsoletes: wine-dxvk-d3d10.i686 <= 2.6.2-1
|
||||
|
||||
%description d3d10
|
||||
%{summary}
|
||||
|
||||
%package d3d9
|
||||
Summary: DXVK D3D9 implementation
|
||||
|
||||
Requires: wine-dxvk%{?_isa} = %{version}-%{release}
|
||||
|
||||
# We want x86_64 users to always have also 32 bit lib, it's the same what wine does
|
||||
%ifarch x86_64
|
||||
Requires: wine-dxvk-d3d9(x86-32) = %{version}-%{release}
|
||||
%endif
|
||||
Obsoletes: wine-dxvk-d3d9.i686 <= 2.6.2-1
|
||||
|
||||
%description d3d9
|
||||
%{summary}
|
||||
|
||||
%package d3d8
|
||||
Summary: DXVK D3D8 implementation
|
||||
|
||||
Requires: wine-dxvk%{?_isa} = %{version}-%{release}
|
||||
|
||||
Obsoletes: wine-dxvk-d3d8.i686 <= 2.6.2-1
|
||||
|
||||
%description d3d8
|
||||
%{summary}
|
||||
|
||||
%prep
|
||||
%autosetup -n dxvk-%{version} -p1
|
||||
%autosetup -n dxvk-%{version} -p1 -a1
|
||||
rm -rf subprojects/libdisplay-info && mv libdisplay-info-%{libdisplay_commit} subprojects/libdisplay-info
|
||||
|
||||
%build
|
||||
%mingw_meson --buildtype=plain --wrap-mode=nodownload --auto-features=enabled --cross-file ../build-win%{target_x86_type}.txt --buildtype release
|
||||
|
|
@ -112,18 +114,16 @@ Requires: wine-dxvk-d3d9(x86-32) = %{version}-%{release}
|
|||
%install
|
||||
%mingw_ninja_install
|
||||
winebuild --builtin %buildroot%mingw_sysroot/mingw/bin/dxgi.dll
|
||||
winebuild --builtin %buildroot%mingw_sysroot/mingw/bin/d3d8.dll
|
||||
winebuild --builtin %buildroot%mingw_sysroot/mingw/bin/d3d9.dll
|
||||
winebuild --builtin %buildroot%mingw_sysroot/mingw/bin/d3d10.dll
|
||||
winebuild --builtin %buildroot%mingw_sysroot/mingw/bin/d3d10core.dll
|
||||
winebuild --builtin %buildroot%mingw_sysroot/mingw/bin/d3d10_1.dll
|
||||
winebuild --builtin %buildroot%mingw_sysroot/mingw/bin/d3d11.dll
|
||||
|
||||
mkdir -p %{buildroot}%{_libdir}/wine/%{winepedir}/
|
||||
install -p -m 644 %buildroot%mingw_sysroot/mingw/bin/dxgi.dll %{buildroot}%{_libdir}/wine/%{winepedir}/dxvk-dxgi.dll
|
||||
install -p -m 644 %buildroot%mingw_sysroot/mingw/bin/d3d8.dll %{buildroot}%{_libdir}/wine/%{winepedir}/dxvk-d3d8.dll
|
||||
install -p -m 644 %buildroot%mingw_sysroot/mingw/bin/d3d9.dll %{buildroot}%{_libdir}/wine/%{winepedir}/dxvk-d3d9.dll
|
||||
install -p -m 644 %buildroot%mingw_sysroot/mingw/bin/d3d10.dll %{buildroot}%{_libdir}/wine/%{winepedir}/dxvk-d3d10.dll
|
||||
install -p -m 644 %buildroot%mingw_sysroot/mingw/bin/d3d10core.dll %{buildroot}%{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll
|
||||
install -p -m 644 %buildroot%mingw_sysroot/mingw/bin/d3d10_1.dll %{buildroot}%{_libdir}/wine/%{winepedir}/dxvk-d3d10_1.dll
|
||||
install -p -m 644 %buildroot%mingw_sysroot/mingw/bin/d3d11.dll %{buildroot}%{_libdir}/wine/%{winepedir}/dxvk-d3d11.dll
|
||||
|
||||
# Clean-up
|
||||
|
|
@ -131,14 +131,8 @@ rm -rf %buildroot%mingw_sysroot/mingw
|
|||
|
||||
%posttrans
|
||||
if vulkaninfo |& grep "ERROR_INITIALIZATION_FAILED\|ERROR_SURFACE_LOST_KHR\|Vulkan support is incomplete" > /dev/null; then
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d10.dll 'wine-d3d10%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10.dll 5 \
|
||||
--slave %{_libdir}/wine/%{winepedir}/d3d10_1.dll 'wine-d3d10_1%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10_1.dll \
|
||||
--slave %{_libdir}/wine/%{winepedir}/d3d10core.dll 'wine-d3d10core%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d11.dll 'wine-d3d11%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d11.dll 5
|
||||
else
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d10.dll 'wine-d3d10%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10.dll 20 \
|
||||
--slave %{_libdir}/wine/%{winepedir}/d3d10_1.dll 'wine-d3d10_1%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10_1.dll \
|
||||
--slave %{_libdir}/wine/%{winepedir}/d3d10core.dll 'wine-d3d10core%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d11.dll 'wine-d3d11%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d11.dll 20
|
||||
fi
|
||||
|
||||
|
|
@ -146,42 +140,65 @@ fi
|
|||
if vulkaninfo |& grep "ERROR_INITIALIZATION_FAILED\|ERROR_SURFACE_LOST_KHR\|Vulkan support is incomplete" > /dev/null; then
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/dxgi.dll 'wine-dxgi%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-dxgi.dll 5
|
||||
else
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/dxgi.dll 'wine-dxgi%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-dxgi.dll 5
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/dxgi.dll 'wine-dxgi%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-dxgi.dll 20
|
||||
fi
|
||||
|
||||
%posttrans d3d10
|
||||
if vulkaninfo |& grep "ERROR_INITIALIZATION_FAILED\|ERROR_SURFACE_LOST_KHR\|Vulkan support is incomplete" > /dev/null; then
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d10core.dll 'wine-d3d10core%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll 5
|
||||
else
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d10core.dll 'wine-d3d10core%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll 20
|
||||
fi
|
||||
|
||||
%posttrans d3d9
|
||||
if vulkaninfo |& grep "ERROR_INITIALIZATION_FAILED\|ERROR_SURFACE_LOST_KHR\|Vulkan support is incomplete" > /dev/null; then
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d9.dll 'wine-d3d9%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d9.dll 5
|
||||
else
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d9.dll 'wine-d3d9%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d9.dll 5
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d9.dll 'wine-d3d9%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d9.dll 20
|
||||
fi
|
||||
|
||||
%posttrans d3d8
|
||||
if vulkaninfo |& grep "ERROR_INITIALIZATION_FAILED\|ERROR_SURFACE_LOST_KHR\|Vulkan support is incomplete" > /dev/null; then
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d8.dll 'wine-d3d8%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d8.dll 5
|
||||
else
|
||||
%{_sbindir}/alternatives --install %{_libdir}/wine/%{winepedir}/d3d8.dll 'wine-d3d8%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d8.dll 20
|
||||
fi
|
||||
|
||||
%postun
|
||||
%{_sbindir}/alternatives --remove 'wine-d3d10%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10.dll
|
||||
%{_sbindir}/alternatives --remove 'wine-d3d11%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d11.dll
|
||||
|
||||
%postun d3d10
|
||||
%{_sbindir}/alternatives --remove 'wine-d3d10core%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll
|
||||
|
||||
%postun d3d9
|
||||
%{_sbindir}/alternatives --remove 'wine-d3d9%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d9.dll
|
||||
|
||||
%postun d3d8
|
||||
%{_sbindir}/alternatives --remove 'wine-d3d8%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-d3d8.dll
|
||||
|
||||
%postun dxgi
|
||||
%{_sbindir}/alternatives --remove 'wine-dxgi%{?_isa}' %{_libdir}/wine/%{winepedir}/dxvk-dxgi.dll
|
||||
|
||||
%files
|
||||
%license LICENSE
|
||||
%doc README.md
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-d3d10.dll
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-d3d10_1.dll
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-d3d11.dll
|
||||
|
||||
%files d3d10
|
||||
%license LICENSE
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-d3d10core.dll
|
||||
|
||||
%files d3d9
|
||||
%license LICENSE
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-d3d9.dll
|
||||
|
||||
%files d3d8
|
||||
%license LICENSE
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-d3d8.dll
|
||||
|
||||
%files dxgi
|
||||
%license LICENSE
|
||||
%{_libdir}/wine/%{winepedir}/dxvk-dxgi.dll
|
||||
|
||||
|
||||
%changelog
|
||||
%autochangelog
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue