#include "../util/util_math.h" #include "d3d11_options.h" namespace dxvk { static bool IsAPITracingDXGI() { #ifdef _WIN32 return !!::GetModuleHandle("dxgitrace.dll"); #else return false; #endif } D3D11Options::D3D11Options(const Config& config, const Rc& device) { this->dcSingleUseMode = config.getOption("d3d11.dcSingleUseMode", true); this->enableRtOutputNanFixup = config.getOption("d3d11.enableRtOutputNanFixup", false); this->zeroInitWorkgroupMemory = config.getOption("d3d11.zeroInitWorkgroupMemory", false); this->forceVolatileTgsmAccess = config.getOption("d3d11.forceVolatileTgsmAccess", false); this->relaxedBarriers = config.getOption("d3d11.relaxedBarriers", false); this->ignoreGraphicsBarriers = config.getOption("d3d11.ignoreGraphicsBarriers", false); this->maxTessFactor = config.getOption("d3d11.maxTessFactor", 0); this->samplerAnisotropy = config.getOption("d3d11.samplerAnisotropy", -1); this->samplerLodBias = config.getOption("d3d11.samplerLodBias", 0.0f); this->invariantPosition = config.getOption("d3d11.invariantPosition", true); this->floatControls = config.getOption("d3d11.floatControls", true); this->disableMsaa = config.getOption("d3d11.disableMsaa", false); this->enableContextLock = config.getOption("d3d11.enableContextLock", false); this->deferSurfaceCreation = config.getOption("dxgi.deferSurfaceCreation", false); this->numBackBuffers = config.getOption("dxgi.numBackBuffers", 0); this->maxFrameLatency = config.getOption("dxgi.maxFrameLatency", 0); this->maxFrameRate = config.getOption("dxgi.maxFrameRate", 0); this->syncInterval = config.getOption("dxgi.syncInterval", -1); this->tearFree = config.getOption("dxgi.tearFree", Tristate::Auto); // Clamp LOD bias so that people don't abuse this in unintended ways this->samplerLodBias = dxvk::fclamp(this->samplerLodBias, -2.0f, 1.0f); int32_t maxImplicitDiscardSize = config.getOption("d3d11.maxImplicitDiscardSize", 256); this->maxImplicitDiscardSize = maxImplicitDiscardSize >= 0 ? VkDeviceSize(maxImplicitDiscardSize) << 10 : VkDeviceSize(~0ull); int32_t maxDynamicImageBufferSize = config.getOption("d3d11.maxDynamicImageBufferSize", -1); this->maxDynamicImageBufferSize = maxDynamicImageBufferSize >= 0 ? VkDeviceSize(maxDynamicImageBufferSize) << 10 : VkDeviceSize(~0ull); auto cachedDynamicResources = config.getOption("d3d11.cachedDynamicResources", std::string()); if (IsAPITracingDXGI()) { // apitrace reads back all mapped resources on the CPU, so // allocating everything in cached memory is necessary to // achieve acceptable performance this->cachedDynamicResources = ~0u; } else { this->cachedDynamicResources = 0u; for (char c : cachedDynamicResources) { switch (c) { case 'c': this->cachedDynamicResources |= D3D11_BIND_CONSTANT_BUFFER; break; case 'v': this->cachedDynamicResources |= D3D11_BIND_VERTEX_BUFFER; break; case 'i': this->cachedDynamicResources |= D3D11_BIND_INDEX_BUFFER; break; case 'r': this->cachedDynamicResources |= D3D11_BIND_SHADER_RESOURCE; break; case 'a': this->cachedDynamicResources = ~0u; break; default: Logger::warn(str::format("Unknown flag for d3d11.cachedDynamicResources option: ", c)); } } } } }