Compare commits

...
Sign in to create a new pull request.

15 commits

Author SHA1 Message Date
Fedora Release Engineering
1226f0fdb3 Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild 2026-07-17 08:49:40 +00:00
Fedora Release Engineering
405a834ede Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild 2026-01-17 20:15:23 +00:00
Gordon Messmer
a7d2dd0824 _libdir was restructured in F42 wine package to support a directory/symlink replacement 2025-12-14 15:36:16 +00:00
František Zatloukal
ab7d332972 Add alternatives setup for d3d8 2025-11-09 23:34:12 +01:00
František Zatloukal
a5e7a6fb0a Spec fixup 2025-09-17 18:11:48 +02:00
František Zatloukal
ef1496d0d5 Release 2.7.1 (RHBZ#2371417) 2025-09-17 17:51:35 +02:00
František Zatloukal
57f1e81a71 Release 2.6.2 2025-07-26 22:50:20 +02:00
Fedora Release Engineering
f46ae98cb6 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-25 20:26:17 +00:00
František Zatloukal
7548ec23e7 Release 2.6.1 (RHBZ#2352416) 2025-04-13 17:02:10 +02:00
František Zatloukal
088ee5d0b4 Fixup sources 2025-01-17 18:00:38 +01:00
František Zatloukal
a275751875 Release 2.5.3 (RHBZ#2337377) 2025-01-17 17:49:15 +01:00
František Zatloukal
9324eb0cc9 Backport Fix messing up the dirty textures bitmask 2024-12-30 11:10:39 +01:00
František Zatloukal
d5d23be0b0 Release 2.5.2 (RHBZ#2333541) 2024-12-22 16:53:31 +01:00
František Zatloukal
c5fa5fe11b Release 2.5.1 (RHBZ#2301360 , RHBZ#2141939)
Closes https://src.fedoraproject.org/rpms/wine-dxvk/pull-request/6# (by @mochaa)
2024-11-25 10:57:10 +01:00
Fedora Release Engineering
75435f9c2b Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-20 09:22:22 +00:00
5 changed files with 89 additions and 1066 deletions

7
.gitignore vendored
View file

@ -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

View file

@ -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>

View file

@ -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
*

View file

@ -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

View file

@ -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