mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Use new fullscreen shaders for meta resolve operations
This commit is contained in:
parent
792f15680a
commit
e91efb6dc2
@ -3054,7 +3054,7 @@ namespace dxvk {
|
|||||||
m_cmd->cmdPushConstants(pipeInfo.pipeLayout,
|
m_cmd->cmdPushConstants(pipeInfo.pipeLayout,
|
||||||
VK_SHADER_STAGE_FRAGMENT_BIT,
|
VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||||
0, sizeof(srcOffset), &srcOffset);
|
0, sizeof(srcOffset), &srcOffset);
|
||||||
m_cmd->cmdDraw(1, region.dstSubresource.layerCount, 0, 0);
|
m_cmd->cmdDraw(3, region.dstSubresource.layerCount, 0, 0);
|
||||||
m_cmd->cmdEndRenderPass();
|
m_cmd->cmdEndRenderPass();
|
||||||
|
|
||||||
m_execBarriers.accessImage(
|
m_execBarriers.accessImage(
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#include "dxvk_device.h"
|
#include "dxvk_device.h"
|
||||||
#include "dxvk_meta_resolve.h"
|
#include "dxvk_meta_resolve.h"
|
||||||
|
|
||||||
#include <dxvk_copy_vert.h>
|
#include <dxvk_fullscreen_geom.h>
|
||||||
#include <dxvk_copy_geom.h>
|
#include <dxvk_fullscreen_vert.h>
|
||||||
|
#include <dxvk_fullscreen_layer_vert.h>
|
||||||
|
|
||||||
#include <dxvk_resolve_frag_f.h>
|
#include <dxvk_resolve_frag_f.h>
|
||||||
#include <dxvk_resolve_frag_f_amd.h>
|
#include <dxvk_resolve_frag_f_amd.h>
|
||||||
#include <dxvk_resolve_frag_u.h>
|
#include <dxvk_resolve_frag_u.h>
|
||||||
@ -103,17 +105,20 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
DxvkMetaResolveObjects::DxvkMetaResolveObjects(DxvkDevice* device)
|
DxvkMetaResolveObjects::DxvkMetaResolveObjects(const DxvkDevice* device)
|
||||||
: m_vkd (device->vkd()),
|
: m_vkd (device->vkd()),
|
||||||
m_sampler (createSampler()),
|
m_sampler (createSampler()),
|
||||||
m_shaderVert (createShaderModule(dxvk_copy_vert)),
|
|
||||||
m_shaderGeom (createShaderModule(dxvk_copy_geom)),
|
|
||||||
m_shaderFragF (device->extensions().amdShaderFragmentMask
|
m_shaderFragF (device->extensions().amdShaderFragmentMask
|
||||||
? createShaderModule(dxvk_resolve_frag_f_amd)
|
? createShaderModule(dxvk_resolve_frag_f_amd)
|
||||||
: createShaderModule(dxvk_resolve_frag_f)),
|
: createShaderModule(dxvk_resolve_frag_f)),
|
||||||
m_shaderFragU (createShaderModule(dxvk_resolve_frag_u)),
|
m_shaderFragU (createShaderModule(dxvk_resolve_frag_u)),
|
||||||
m_shaderFragI (createShaderModule(dxvk_resolve_frag_i)) {
|
m_shaderFragI (createShaderModule(dxvk_resolve_frag_i)) {
|
||||||
|
if (device->extensions().extShaderViewportIndexLayer) {
|
||||||
|
m_shaderVert = createShaderModule(dxvk_fullscreen_layer_vert);
|
||||||
|
} else {
|
||||||
|
m_shaderVert = createShaderModule(dxvk_fullscreen_vert);
|
||||||
|
m_shaderGeom = createShaderModule(dxvk_fullscreen_geom);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -308,6 +313,7 @@ namespace dxvk {
|
|||||||
auto formatInfo = imageFormatInfo(key.format);
|
auto formatInfo = imageFormatInfo(key.format);
|
||||||
|
|
||||||
std::array<VkPipelineShaderStageCreateInfo, 3> stages;
|
std::array<VkPipelineShaderStageCreateInfo, 3> stages;
|
||||||
|
uint32_t stageCount = 0;
|
||||||
|
|
||||||
VkSpecializationMapEntry specEntry;
|
VkSpecializationMapEntry specEntry;
|
||||||
specEntry.constantID = 0;
|
specEntry.constantID = 0;
|
||||||
@ -320,7 +326,7 @@ namespace dxvk {
|
|||||||
specInfo.dataSize = sizeof(VkSampleCountFlagBits);
|
specInfo.dataSize = sizeof(VkSampleCountFlagBits);
|
||||||
specInfo.pData = &key.samples;
|
specInfo.pData = &key.samples;
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo& vsStage = stages[0];
|
VkPipelineShaderStageCreateInfo& vsStage = stages[stageCount++];
|
||||||
vsStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
vsStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
vsStage.pNext = nullptr;
|
vsStage.pNext = nullptr;
|
||||||
vsStage.flags = 0;
|
vsStage.flags = 0;
|
||||||
@ -329,16 +335,18 @@ namespace dxvk {
|
|||||||
vsStage.pName = "main";
|
vsStage.pName = "main";
|
||||||
vsStage.pSpecializationInfo = nullptr;
|
vsStage.pSpecializationInfo = nullptr;
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo& gsStage = stages[1];
|
if (m_shaderGeom) {
|
||||||
gsStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
VkPipelineShaderStageCreateInfo& gsStage = stages[stageCount++];
|
||||||
gsStage.pNext = nullptr;
|
gsStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
gsStage.flags = 0;
|
gsStage.pNext = nullptr;
|
||||||
gsStage.stage = VK_SHADER_STAGE_GEOMETRY_BIT;
|
gsStage.flags = 0;
|
||||||
gsStage.module = m_shaderGeom;
|
gsStage.stage = VK_SHADER_STAGE_GEOMETRY_BIT;
|
||||||
gsStage.pName = "main";
|
gsStage.module = m_shaderGeom;
|
||||||
gsStage.pSpecializationInfo = nullptr;
|
gsStage.pName = "main";
|
||||||
|
gsStage.pSpecializationInfo = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo& psStage = stages[2];
|
VkPipelineShaderStageCreateInfo& psStage = stages[stageCount++];
|
||||||
psStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
psStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
psStage.pNext = nullptr;
|
psStage.pNext = nullptr;
|
||||||
psStage.flags = 0;
|
psStage.flags = 0;
|
||||||
@ -377,7 +385,7 @@ namespace dxvk {
|
|||||||
iaState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
iaState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
||||||
iaState.pNext = nullptr;
|
iaState.pNext = nullptr;
|
||||||
iaState.flags = 0;
|
iaState.flags = 0;
|
||||||
iaState.topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
|
iaState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
iaState.primitiveRestartEnable = VK_FALSE;
|
iaState.primitiveRestartEnable = VK_FALSE;
|
||||||
|
|
||||||
VkPipelineViewportStateCreateInfo vpState;
|
VkPipelineViewportStateCreateInfo vpState;
|
||||||
@ -444,7 +452,7 @@ namespace dxvk {
|
|||||||
info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||||
info.pNext = nullptr;
|
info.pNext = nullptr;
|
||||||
info.flags = 0;
|
info.flags = 0;
|
||||||
info.stageCount = stages.size();
|
info.stageCount = stageCount;
|
||||||
info.pStages = stages.data();
|
info.pStages = stages.data();
|
||||||
info.pVertexInputState = &viState;
|
info.pVertexInputState = &viState;
|
||||||
info.pInputAssemblyState = &iaState;
|
info.pInputAssemblyState = &iaState;
|
||||||
|
@ -98,7 +98,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
DxvkMetaResolveObjects(DxvkDevice* device);
|
DxvkMetaResolveObjects(const DxvkDevice* device);
|
||||||
~DxvkMetaResolveObjects();
|
~DxvkMetaResolveObjects();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -118,11 +118,11 @@ namespace dxvk {
|
|||||||
|
|
||||||
VkSampler m_sampler;
|
VkSampler m_sampler;
|
||||||
|
|
||||||
VkShaderModule m_shaderVert;
|
VkShaderModule m_shaderVert = VK_NULL_HANDLE;
|
||||||
VkShaderModule m_shaderGeom;
|
VkShaderModule m_shaderGeom = VK_NULL_HANDLE;
|
||||||
VkShaderModule m_shaderFragF;
|
VkShaderModule m_shaderFragF = VK_NULL_HANDLE;
|
||||||
VkShaderModule m_shaderFragU;
|
VkShaderModule m_shaderFragU = VK_NULL_HANDLE;
|
||||||
VkShaderModule m_shaderFragI;
|
VkShaderModule m_shaderFragI = VK_NULL_HANDLE;
|
||||||
|
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user