Compare commits

...

20 Commits

Author SHA1 Message Date
Philip Rebohle 40e4ea1fce
[meta] Release 1.10.2 2022-07-13 14:47:29 +02:00
Philip Rebohle 7d2c2207fa
[d3d9] Fix up unsupported sample counts 2022-07-13 14:23:31 +02:00
Robin Kertels 2c40d49337
[d3d9] Allow POOL_SCRATCH targets in GetFrontBufferData 2022-07-13 14:01:01 +02:00
Blisto91 5f67d0fc89
[d3d9] add D3DFMT_UNKNOWN to windowed BackBufferFormat 2022-07-13 13:04:44 +02:00
Philip Rebohle 05416c3731
[d3d9] Explicitly check for Unknown in CheckDeviceFormatConversion 2022-07-13 13:04:43 +02:00
Philip Rebohle 8513ab4d77
[util] Work around silly compiler warnings on GCC 12.1
No, we're not actually reading 64 bytes from a 1-byte area.
2022-07-11 19:24:36 +02:00
Matej Dian 74abd7b525
[util] Enable cached dynamic resources for DayZ (#2709) 2022-07-10 15:19:30 +02:00
Blisto91 6a33c5d4f0
[util] Add workaround for Garden Warfare 2 (#2700) 2022-07-10 15:19:27 +02:00
Philip Rebohle 310d70bbf8
[d3d11] Ignore OMSetRenderTargets calls with incompatible view sizes
Fixes #2701.
2022-07-10 15:17:19 +02:00
Blisto91 e37bdcf348
[util] disable allowDoNotWait for Port Royale 3 (#2668) 2022-07-09 01:03:39 +02:00
Philip Rebohle aaf0db4c79
[dxvk] Remove in-memory pipeline cache
Lazy port of the changes in current development branches.
2022-07-08 19:29:07 +02:00
Trevonn 653f00d846
[util] Limit Dead Space to 60fps and fix vsync
https://www.pcgamingwiki.com/wiki/Dead_Space#Issues_fixed

The game has mouse acceleration and physics issues above 60 FPS.

Also the game locks to 30 FPS using the built-in vsync. 
Setting presentInterval to 1 blocks this and the game continues to run at 60 FPS
2022-07-07 16:15:47 +02:00
Georg Lehmann 96b3897fd9
[d3d9] Add an config option to disable non seamless cube maps. 2022-07-07 16:15:41 +02:00
Georg Lehmann b40a4286e4
[d3d9] Use non seamless samplers if supported. 2022-07-07 16:15:30 +02:00
Georg Lehmann cb76b02675
[dxvk] Enable VK_EXT_non_seamless_cube_map if requested. 2022-07-07 16:15:12 +02:00
Georg Lehmann 33f83e9561
[dxvk] Allow non seamless samplers. 2022-07-07 16:12:56 +02:00
Georg Lehmann 11b94088ad
[include] Update Vulkan headers to 1.3.217. 2022-07-07 16:12:44 +02:00
WinterSnowfall 7ae6564e0d
[util] Add workaround to fix missing sun & light shafts in Beyond Good And Evil 2022-07-07 16:11:58 +02:00
Philip Rebohle 2f6306815e
[dxvk] Fix opening state cache files for writing
operator bool() only checks if errors have occured in previous writes,
so we'd be missing out on the first cache entry written.
2022-07-03 15:38:53 +02:00
Philip Rebohle d1f57e13b7
[d3d9] Don't use VK_RESOLVE_MODE_AVERAGE_BIT_KHR for stencil resolves
Doesn't work, always write sample zero instead.
2022-07-02 16:48:23 +02:00
31 changed files with 2121 additions and 881 deletions

View File

@ -1 +1 @@
1.10.1
1.10.2

View File

@ -548,6 +548,16 @@
# d3d9.apitraceMode = False
# Seamless Cubes
#
# Don't use non seamless cube maps even if they are supported.
# Non seamless cubes are correct d3d9 behavior, but can produce worse looking edges.
#
# Supported values:
# - True/False
# d3d9.seamlessCubes = False
# Debug Utils
#
# Enables debug utils as this is off by default, this enables user annotations like BeginEvent()/EndEvent().

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
project('dxvk', ['c', 'cpp'], version : 'v1.10.1', meson_version : '>= 0.49', default_options : [ 'cpp_std=c++17' ])
project('dxvk', ['c', 'cpp'], version : 'v1.10.2', meson_version : '>= 0.49', default_options : [ 'cpp_std=c++17' ])
cpu_family = target_machine.cpu_family()

View File

@ -4434,6 +4434,13 @@ namespace dxvk {
if (curView->imageInfo().sampleCount
!= refView->imageInfo().sampleCount)
return false;
VkExtent3D curExtent = curView->mipLevelExtent(0);
VkExtent3D refExtent = refView->mipLevelExtent(0);
if (curExtent.width != refExtent.width
|| curExtent.height != refExtent.height)
return false;
} else {
// Set reference view. All remaining views
// must be compatible to the reference view.

View File

@ -38,6 +38,7 @@ namespace dxvk {
info.borderColor.float32[i] = desc.BorderColor[i];
info.usePixelCoord = VK_FALSE; // Not supported in D3D11
info.nonSeamless = VK_FALSE;
// Make sure to use a valid anisotropy value
if (desc.MaxAnisotropy < 1) info.maxAnisotropy = 1.0f;

View File

@ -365,6 +365,7 @@ namespace dxvk {
samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;
samplerInfo.borderColor = VkClearColorValue();
samplerInfo.usePixelCoord = VK_FALSE;
samplerInfo.nonSeamless = VK_FALSE;
m_sampler = Device->createSampler(samplerInfo);
DxvkBufferCreateInfo bufferInfo;

View File

@ -236,7 +236,8 @@ namespace dxvk {
D3DDEVTYPE DeviceType,
D3D9Format SourceFormat,
D3D9Format TargetFormat) {
bool sourceSupported = IsSupportedBackBufferFormat(D3D9Format::Unknown, SourceFormat, TRUE);
bool sourceSupported = SourceFormat != D3D9Format::Unknown
&& IsSupportedBackBufferFormat(SourceFormat);
bool targetSupported = TargetFormat == D3D9Format::X1R5G5B5
|| TargetFormat == D3D9Format::A1R5G5B5
|| TargetFormat == D3D9Format::R5G6B5

View File

@ -134,7 +134,7 @@ namespace dxvk {
if (pDesc->Width == 0 || pDesc->Height == 0 || pDesc->Depth == 0)
return D3DERR_INVALIDCALL;
if (FAILED(DecodeMultiSampleType(pDesc->MultiSample, pDesc->MultisampleQuality, nullptr)))
if (FAILED(DecodeMultiSampleType(pDevice->GetDXVKDevice(), pDesc->MultiSample, pDesc->MultisampleQuality, nullptr)))
return D3DERR_INVALIDCALL;
// Using MANAGED pool with DYNAMIC usage is illegal
@ -258,7 +258,7 @@ namespace dxvk {
imageInfo.stages |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
}
DecodeMultiSampleType(m_desc.MultiSample, m_desc.MultisampleQuality, &imageInfo.sampleCount);
DecodeMultiSampleType(m_device->GetDXVKDevice(), m_desc.MultiSample, m_desc.MultisampleQuality, &imageInfo.sampleCount);
// The image must be marked as mutable if it can be reinterpreted
// by a view with a different format. Depth-stencil formats cannot

View File

@ -1066,7 +1066,7 @@ namespace dxvk {
ctx->resolveDepthStencilImage(
cDstImage, cSrcImage, cRegion,
VK_RESOLVE_MODE_AVERAGE_BIT_KHR,
VK_RESOLVE_MODE_AVERAGE_BIT_KHR);
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR);
}
});
};
@ -3947,6 +3947,8 @@ namespace dxvk {
enabled.extCustomBorderColor.customBorderColorWithoutFormat = VK_TRUE;
}
enabled.extNonSeamlessCubeMap.nonSeamlessCubeMap = supported.extNonSeamlessCubeMap.nonSeamlessCubeMap;
return enabled;
}
@ -5952,6 +5954,7 @@ namespace dxvk {
info.mipmapLodMin = mipFilter.MipsEnabled ? float(cKey.MaxMipLevel) : 0;
info.mipmapLodMax = mipFilter.MipsEnabled ? FLT_MAX : 0;
info.usePixelCoord = VK_FALSE;
info.nonSeamless = m_dxvkDevice->features().extNonSeamlessCubeMap.nonSeamlessCubeMap && !m_d3d9Options.seamlessCubes;
DecodeD3DCOLOR(cKey.BorderColor, info.borderColor.float32);
@ -6955,7 +6958,7 @@ namespace dxvk {
const D3D9_COMMON_TEXTURE_DESC* dstDesc = dstTextureInfo->Desc();
VkSampleCountFlagBits dstSampleCount;
DecodeMultiSampleType(dstDesc->MultiSample, dstDesc->MultisampleQuality, &dstSampleCount);
DecodeMultiSampleType(m_dxvkDevice, dstDesc->MultiSample, dstDesc->MultisampleQuality, &dstSampleCount);
if (unlikely(dstSampleCount != VK_SAMPLE_COUNT_1_BIT)) {
Logger::warn("D3D9DeviceEx::ResolveZ: dstSampleCount != 1. Discarding.");
@ -6987,7 +6990,7 @@ namespace dxvk {
srcSubresource.arrayLayer, 1 };
VkSampleCountFlagBits srcSampleCount;
DecodeMultiSampleType(srcDesc->MultiSample, srcDesc->MultisampleQuality, &srcSampleCount);
DecodeMultiSampleType(m_dxvkDevice, srcDesc->MultiSample, srcDesc->MultisampleQuality, &srcSampleCount);
if (srcSampleCount == VK_SAMPLE_COUNT_1_BIT) {
EmitCs([

View File

@ -57,7 +57,8 @@ namespace dxvk {
|| BackBufferFormat == D3D9Format::X8R8G8B8
|| BackBufferFormat == D3D9Format::A1R5G5B5
|| BackBufferFormat == D3D9Format::X1R5G5B5
|| BackBufferFormat == D3D9Format::R5G6B5;
|| BackBufferFormat == D3D9Format::R5G6B5
|| BackBufferFormat == D3D9Format::Unknown;
}
}

View File

@ -73,6 +73,7 @@ namespace dxvk {
this->apitraceMode = config.getOption<bool> ("d3d9.apitraceMode", false);
this->deviceLocalConstantBuffers = config.getOption<bool> ("d3d9.deviceLocalConstantBuffers", false);
this->allowDirectBufferMapping = config.getOption<bool> ("d3d9.allowDirectBufferMapping", true);
this->seamlessCubes = config.getOption<bool> ("d3d9.seamlessCubes", false);
// If we are not Nvidia, enable general hazards.
this->generalHazards = adapter != nullptr

View File

@ -157,6 +157,9 @@ namespace dxvk {
/// Disable direct buffer mapping
bool allowDirectBufferMapping;
/// Don't use non seamless cube maps
bool seamlessCubes;
};
}

View File

@ -333,7 +333,7 @@ namespace dxvk {
D3D9CommonTexture* dstTexInfo = dst->GetCommonTexture();
D3D9CommonTexture* srcTexInfo = m_backBuffers.back()->GetCommonTexture();
if (unlikely(dstTexInfo->Desc()->Pool != D3DPOOL_SYSTEMMEM))
if (unlikely(dstTexInfo->Desc()->Pool != D3DPOOL_SYSTEMMEM && dstTexInfo->Desc()->Pool != D3DPOOL_SCRATCH))
return D3DERR_INVALIDCALL;
Rc<DxvkBuffer> dstBuffer = dstTexInfo->GetBuffer(dst->GetSubresource());

View File

@ -37,9 +37,10 @@ namespace dxvk {
HRESULT DecodeMultiSampleType(
const Rc<DxvkDevice>& pDevice,
D3DMULTISAMPLE_TYPE MultiSample,
DWORD MultisampleQuality,
VkSampleCountFlagBits* pCount) {
VkSampleCountFlagBits* pSampleCount) {
uint32_t sampleCount = std::max<uint32_t>(MultiSample, 1u);
// Check if this is a power of two...
@ -49,8 +50,14 @@ namespace dxvk {
if (MultiSample == D3DMULTISAMPLE_NONMASKABLE)
sampleCount = 1u << MultisampleQuality;
if (pCount != nullptr)
*pCount = VkSampleCountFlagBits(sampleCount);
const auto& limits = pDevice->properties().core.properties.limits;
VkSampleCountFlags supportedSampleCounts = limits.framebufferColorSampleCounts & limits.framebufferDepthSampleCounts;
while (sampleCount > supportedSampleCounts)
sampleCount >>= 1;
if (pSampleCount)
*pSampleCount = VkSampleCountFlagBits(sampleCount);
return D3D_OK;
}

View File

@ -95,9 +95,10 @@ namespace dxvk {
ID3DBlob** ppDisassembly);
HRESULT DecodeMultiSampleType(
D3DMULTISAMPLE_TYPE MultiSample,
DWORD MultisampleQuality,
VkSampleCountFlagBits* pCount);
const Rc<DxvkDevice>& pDevice,
D3DMULTISAMPLE_TYPE MultiSample,
DWORD MultisampleQuality,
VkSampleCountFlagBits* pSampleCount);
VkFormat GetPackedDepthStencilFormat(D3D9Format Format);

View File

@ -238,6 +238,8 @@ namespace dxvk {
|| !required.extHostQueryReset.hostQueryReset)
&& (m_deviceFeatures.extMemoryPriority.memoryPriority
|| !required.extMemoryPriority.memoryPriority)
&& (m_deviceFeatures.extNonSeamlessCubeMap.nonSeamlessCubeMap
|| !required.extNonSeamlessCubeMap.nonSeamlessCubeMap)
&& (m_deviceFeatures.extRobustness2.robustBufferAccess2
|| !required.extRobustness2.robustBufferAccess2)
&& (m_deviceFeatures.extRobustness2.robustImageAccess2
@ -263,7 +265,7 @@ namespace dxvk {
DxvkDeviceFeatures enabledFeatures) {
DxvkDeviceExtensions devExtensions;
std::array<DxvkExt*, 29> devExtensionList = {{
std::array<DxvkExt*, 30> devExtensionList = {{
&devExtensions.amdMemoryOverallocationBehaviour,
&devExtensions.amdShaderFragmentMask,
&devExtensions.ext4444Formats,
@ -275,6 +277,7 @@ namespace dxvk {
&devExtensions.extHostQueryReset,
&devExtensions.extMemoryBudget,
&devExtensions.extMemoryPriority,
&devExtensions.extNonSeamlessCubeMap,
&devExtensions.extRobustness2,
&devExtensions.extShaderDemoteToHelperInvocation,
&devExtensions.extShaderStencilExport,
@ -377,6 +380,11 @@ namespace dxvk {
enabledFeatures.extMemoryPriority.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extMemoryPriority);
}
if (devExtensions.extNonSeamlessCubeMap) {
enabledFeatures.extNonSeamlessCubeMap.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT;
enabledFeatures.extNonSeamlessCubeMap.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extNonSeamlessCubeMap);
}
if (devExtensions.extShaderDemoteToHelperInvocation) {
enabledFeatures.extShaderDemoteToHelperInvocation.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT;
enabledFeatures.extShaderDemoteToHelperInvocation.pNext = std::exchange(enabledFeatures.core.pNext, &enabledFeatures.extShaderDemoteToHelperInvocation);
@ -682,6 +690,11 @@ namespace dxvk {
m_deviceFeatures.extMemoryPriority.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extMemoryPriority);
}
if (m_deviceExtensions.supports(VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME)) {
m_deviceFeatures.extNonSeamlessCubeMap.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT;
m_deviceFeatures.extNonSeamlessCubeMap.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extNonSeamlessCubeMap);
}
if (m_deviceExtensions.supports(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
m_deviceFeatures.extRobustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT;
m_deviceFeatures.extRobustness2.pNext = std::exchange(m_deviceFeatures.core.pNext, &m_deviceFeatures.extRobustness2);
@ -787,6 +800,8 @@ namespace dxvk {
"\n hostQueryReset : ", features.extHostQueryReset.hostQueryReset ? "1" : "0",
"\n", VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME,
"\n memoryPriority : ", features.extMemoryPriority.memoryPriority ? "1" : "0",
"\n", VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME,
"\n nonSeamlessCubeMap : ", features.extNonSeamlessCubeMap.nonSeamlessCubeMap ? "1" : "0",
"\n", VK_EXT_ROBUSTNESS_2_EXTENSION_NAME,
"\n robustBufferAccess2 : ", features.extRobustness2.robustBufferAccess2 ? "1" : "0",
"\n robustImageAccess2 : ", features.extRobustness2.robustImageAccess2 ? "1" : "0",

View File

@ -43,6 +43,7 @@ namespace dxvk {
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extExtendedDynamicState;
VkPhysicalDeviceHostQueryResetFeaturesEXT extHostQueryReset;
VkPhysicalDeviceMemoryPriorityFeaturesEXT extMemoryPriority;
VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT extNonSeamlessCubeMap;
VkPhysicalDeviceRobustness2FeaturesEXT extRobustness2;
VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT extShaderDemoteToHelperInvocation;
VkPhysicalDeviceTransformFeedbackFeaturesEXT extTransformFeedback;

View File

@ -287,6 +287,7 @@ namespace dxvk {
DxvkExt extHostQueryReset = { VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extMemoryBudget = { VK_EXT_MEMORY_BUDGET_EXTENSION_NAME, DxvkExtMode::Passive };
DxvkExt extMemoryPriority = { VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extNonSeamlessCubeMap = { VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extRobustness2 = { VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extShaderDemoteToHelperInvocation = { VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, DxvkExtMode::Optional };
DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional };

View File

@ -128,7 +128,7 @@ namespace dxvk {
appInfo.pApplicationName = appName.c_str();
appInfo.applicationVersion = 0;
appInfo.pEngineName = "DXVK";
appInfo.engineVersion = VK_MAKE_VERSION(1, 10, 1);
appInfo.engineVersion = VK_MAKE_VERSION(1, 10, 2);
appInfo.apiVersion = VK_MAKE_VERSION(1, 1, 0);
VkInstanceCreateInfo info;

View File

@ -2,25 +2,4 @@
namespace dxvk {
DxvkPipelineCache::DxvkPipelineCache(
const Rc<vk::DeviceFn>& vkd)
: m_vkd(vkd) {
VkPipelineCacheCreateInfo info;
info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
info.pNext = nullptr;
info.flags = 0;
info.initialDataSize = 0;
info.pInitialData = nullptr;
if (m_vkd->vkCreatePipelineCache(m_vkd->device(),
&info, nullptr, &m_handle) != VK_SUCCESS)
throw DxvkError("DxvkPipelineCache: Failed to create cache");
}
DxvkPipelineCache::~DxvkPipelineCache() {
m_vkd->vkDestroyPipelineCache(
m_vkd->device(), m_handle, nullptr);
}
}

View File

@ -22,22 +22,16 @@ namespace dxvk {
public:
DxvkPipelineCache(const Rc<vk::DeviceFn>& vkd);
~DxvkPipelineCache();
DxvkPipelineCache(const Rc<vk::DeviceFn>& vkd) { }
/**
* \brief Pipeline cache handle
* \returns Pipeline cache handle
*/
VkPipelineCache handle() const {
return m_handle;
return VK_NULL_HANDLE;
}
private:
Rc<vk::DeviceFn> m_vkd;
VkPipelineCache m_handle;
};
}

View File

@ -16,7 +16,7 @@ namespace dxvk {
VkSamplerCreateInfo samplerInfo;
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
samplerInfo.pNext = nullptr;
samplerInfo.flags = 0;
samplerInfo.flags = info.nonSeamless ? VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT : 0;
samplerInfo.magFilter = info.magFilter;
samplerInfo.minFilter = info.minFilter;
samplerInfo.mipmapMode = info.mipmapMode;

View File

@ -38,6 +38,9 @@ namespace dxvk {
/// Enables unnormalized coordinates
VkBool32 usePixelCoord;
/// Enables non seamless cube map filtering
VkBool32 nonSeamless;
};

View File

@ -962,8 +962,8 @@ namespace dxvk {
m_writerQueue.pop();
}
if (!file) {
file = std::ofstream(getCacheFileName().c_str(),
if (!file.is_open()) {
file.open(getCacheFileName().c_str(),
std::ios_base::binary |
std::ios_base::app);
}

View File

@ -302,6 +302,7 @@ namespace dxvk {
samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;
samplerInfo.borderColor = VkClearColorValue();
samplerInfo.usePixelCoord = VK_TRUE;
samplerInfo.nonSeamless = VK_FALSE;
m_samplerPresent = m_device->createSampler(samplerInfo);
samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;

View File

@ -53,6 +53,7 @@ namespace dxvk {
info.compareOp = VK_COMPARE_OP_NEVER;
info.borderColor = VkClearColorValue();
info.usePixelCoord = VK_FALSE;
info.nonSeamless = VK_FALSE;
return dev->createSampler(info);
}

View File

@ -311,6 +311,7 @@ namespace dxvk::hud {
info.compareOp = VK_COMPARE_OP_NEVER;
info.borderColor = VkClearColorValue();
info.usePixelCoord = VK_TRUE;
info.nonSeamless = VK_FALSE;
return m_device->createSampler(info);
}

View File

@ -296,6 +296,15 @@ namespace dxvk {
{ R"(\\AWayOut(_friend)?\.exe$)", {{
{ "dxgi.maxFrameLatency", "1" },
}} },
/* Garden Warfare 2
Won't start on amd Id without atiadlxx */
{ R"(\\GW2.Main_Win64_Retail\.exe$)", {{
{ "dxgi.customVendorId", "10de" },
}} },
/* DayZ */
{ R"(\\DayZ_x64\.exe$)", {{
{ "d3d11.cachedDynamicResources", "cr" },
}} },
/**********************************************/
/* D3D9 GAMES */
@ -342,9 +351,13 @@ namespace dxvk {
{ "d3d9.memoryTrackTest", "True" },
}} },
/* Dead Space uses the a NULL render target instead
of a 1x1 one if DF24 is NOT supported */
of a 1x1 one if DF24 is NOT supported
Mouse and physics issues above 60 FPS
Built-in Vsync Locks the game to 30 FPS */
{ R"(\\Dead Space\.exe$)", {{
{ "d3d9.supportDFFormats", "False" },
{ "d3d9.maxFrameRate", "60" },
{ "d3d9.presentInterval", "1" },
}} },
/* Halo CE/HaloPC */
{ R"(\\halo(ce)?\.exe$)", {{
@ -565,6 +578,11 @@ namespace dxvk {
{ R"(\\eoa\.exe$)", {{
{ "d3d9.customVendorId", "10de" },
}} },
/* Beyond Good And Evil *
* Fixes missing sun and light shafts */
{ R"(\\BGE\.exe$)", {{
{ "d3d9.allowDoNotWait", "False" },
}} },
/* Supreme Commander & Forged Alliance Forever */
{ R"(\\(SupremeCommander|ForgedAlliance)\.exe$)", {{
{ "d3d9.floatEmulation", "Strict" },
@ -573,6 +591,16 @@ namespace dxvk {
{ R"(\\swtor\.exe$)", {{
{ "d3d9.forceSamplerTypeSpecConstants", "True" },
}} },
/* Bionic Commando
Physics break at high fps */
{ R"(\\bionic_commando\.exe$)", {{
{ "d3d9.maxFrameRate", "60" },
}} },
/* Port Royale 3 *
* Fixes infinite loading screens */
{ R"(\\PortRoyale3\.exe$)", {{
{ "d3d9.allowDoNotWait", "False" },
}} },
}};

View File

@ -48,7 +48,7 @@ typedef union {
* Hash a single 512-bit block. This is the core of the algorithm.
*/
void
SHA1Transform(uint32_t state[5], const uint8_t buffer[SHA1_BLOCK_LENGTH])
SHA1Transform(uint32_t state[5], const uint8_t* buffer)
{
uint32_t a, b, c, d, e;
uint8_t workspace[SHA1_BLOCK_LENGTH];

View File

@ -28,7 +28,7 @@ typedef struct _SHA1_CTX {
void SHA1Init(SHA1_CTX *);
void SHA1Pad(SHA1_CTX *);
void SHA1Transform(uint32_t [5], const uint8_t [SHA1_BLOCK_LENGTH]);
void SHA1Transform(uint32_t [5], const uint8_t*);
void SHA1Update(SHA1_CTX *, const uint8_t *, size_t);
void SHA1Final(uint8_t [SHA1_DIGEST_LENGTH], SHA1_CTX *);