mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 19:54:19 +01:00
[dxvk] Get rid of internal blit samplers
This commit is contained in:
parent
67d1285b08
commit
150c40280f
@ -1726,8 +1726,10 @@ namespace dxvk {
|
||||
|
||||
// Common descriptor set properties that we use to
|
||||
// bind the source image view to the fragment shader
|
||||
Rc<DxvkSampler> sampler = createBlitSampler(filter);
|
||||
|
||||
VkDescriptorImageInfo descriptorImage = { };
|
||||
descriptorImage.sampler = m_common->metaBlit().getSampler(filter);
|
||||
descriptorImage.sampler = sampler->handle();
|
||||
descriptorImage.imageLayout = srcLayout;
|
||||
|
||||
VkWriteDescriptorSet descriptorWrite = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET };
|
||||
@ -1850,6 +1852,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
m_cmd->trackResource<DxvkAccess::Write>(imageView->image());
|
||||
m_cmd->trackSampler(sampler);
|
||||
}
|
||||
|
||||
|
||||
@ -3179,8 +3182,10 @@ namespace dxvk {
|
||||
m_cmd->cmdSetScissor(1, &scissor);
|
||||
|
||||
// Bind source image view
|
||||
Rc<DxvkSampler> sampler = createBlitSampler(filter);
|
||||
|
||||
VkDescriptorImageInfo descriptorImage;
|
||||
descriptorImage.sampler = m_common->metaBlit().getSampler(filter);
|
||||
descriptorImage.sampler = sampler->handle();
|
||||
descriptorImage.imageView = srcView->handle();
|
||||
descriptorImage.imageLayout = srcLayout;
|
||||
|
||||
@ -3240,6 +3245,7 @@ namespace dxvk {
|
||||
|
||||
m_cmd->trackResource<DxvkAccess::Write>(dstView->image());
|
||||
m_cmd->trackResource<DxvkAccess::Read>(srcView->image());
|
||||
m_cmd->trackSampler(sampler);
|
||||
}
|
||||
|
||||
|
||||
@ -6725,6 +6731,20 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkSampler> DxvkContext::createBlitSampler(
|
||||
VkFilter filter) {
|
||||
DxvkSamplerKey samplerKey;
|
||||
samplerKey.setFilter(filter, filter,
|
||||
VK_SAMPLER_MIPMAP_MODE_NEAREST);
|
||||
samplerKey.setAddressModes(
|
||||
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
||||
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
||||
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
|
||||
|
||||
return m_device->createSampler(samplerKey);
|
||||
}
|
||||
|
||||
|
||||
DxvkGraphicsPipeline* DxvkContext::lookupGraphicsPipeline(
|
||||
const DxvkGraphicsPipelineShaders& shaders) {
|
||||
auto idx = shaders.hash() % m_gpLookupCache.size();
|
||||
|
@ -1741,6 +1741,9 @@ namespace dxvk {
|
||||
size_t imageCount,
|
||||
const DxvkRelocateImageInfo* imageInfos);
|
||||
|
||||
Rc<DxvkSampler> createBlitSampler(
|
||||
VkFilter filter);
|
||||
|
||||
DxvkGraphicsPipeline* lookupGraphicsPipeline(
|
||||
const DxvkGraphicsPipelineShaders& shaders);
|
||||
|
||||
|
@ -13,8 +13,6 @@ namespace dxvk {
|
||||
|
||||
DxvkMetaBlitObjects::DxvkMetaBlitObjects(const DxvkDevice* device)
|
||||
: m_vkd (device->vkd()),
|
||||
m_samplerCopy (createSampler(VK_FILTER_NEAREST)),
|
||||
m_samplerBlit (createSampler(VK_FILTER_LINEAR)),
|
||||
m_shaderFrag1D(createShaderModule(dxvk_blit_frag_1d)),
|
||||
m_shaderFrag2D(createShaderModule(dxvk_blit_frag_2d)),
|
||||
m_shaderFrag3D(createShaderModule(dxvk_blit_frag_3d)) {
|
||||
@ -39,9 +37,6 @@ namespace dxvk {
|
||||
m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderFrag1D, nullptr);
|
||||
m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderGeom, nullptr);
|
||||
m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderVert, nullptr);
|
||||
|
||||
m_vkd->vkDestroySampler(m_vkd->device(), m_samplerBlit, nullptr);
|
||||
m_vkd->vkDestroySampler(m_vkd->device(), m_samplerCopy, nullptr);
|
||||
}
|
||||
|
||||
|
||||
@ -64,32 +59,8 @@ namespace dxvk {
|
||||
m_pipelines.insert({ key, pipeline });
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
|
||||
VkSampler DxvkMetaBlitObjects::getSampler(VkFilter filter) {
|
||||
return filter == VK_FILTER_NEAREST
|
||||
? m_samplerCopy
|
||||
: m_samplerBlit;
|
||||
}
|
||||
|
||||
|
||||
VkSampler DxvkMetaBlitObjects::createSampler(VkFilter filter) const {
|
||||
VkSamplerCreateInfo info = { VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO };
|
||||
info.magFilter = filter;
|
||||
info.minFilter = filter;
|
||||
info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
|
||||
info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||
info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||
info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||
info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
||||
|
||||
VkSampler result = VK_NULL_HANDLE;
|
||||
if (m_vkd->vkCreateSampler(m_vkd->device(), &info, nullptr, &result) != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaBlitObjects: Failed to create sampler");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
VkShaderModule DxvkMetaBlitObjects::createShaderModule(const SpirvCodeBuffer& code) const {
|
||||
VkShaderModuleCreateInfo info = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO };
|
||||
info.codeSize = code.size();
|
||||
|
@ -115,22 +115,10 @@ namespace dxvk {
|
||||
VkFormat viewFormat,
|
||||
VkSampleCountFlagBits samples);
|
||||
|
||||
/**
|
||||
* \brief Retrieves sampler with a given filter
|
||||
*
|
||||
* \param [in] filter The desired filter
|
||||
* \returns Sampler object with the given filter
|
||||
*/
|
||||
VkSampler getSampler(
|
||||
VkFilter filter);
|
||||
|
||||
private:
|
||||
|
||||
Rc<vk::DeviceFn> m_vkd;
|
||||
|
||||
VkSampler m_samplerCopy;
|
||||
VkSampler m_samplerBlit;
|
||||
|
||||
VkShaderModule m_shaderVert = VK_NULL_HANDLE;
|
||||
VkShaderModule m_shaderGeom = VK_NULL_HANDLE;
|
||||
VkShaderModule m_shaderFrag1D = VK_NULL_HANDLE;
|
||||
@ -144,9 +132,6 @@ namespace dxvk {
|
||||
DxvkMetaBlitPipeline,
|
||||
DxvkHash, DxvkEq> m_pipelines;
|
||||
|
||||
VkSampler createSampler(
|
||||
VkFilter filter) const;
|
||||
|
||||
VkShaderModule createShaderModule(
|
||||
const SpirvCodeBuffer& code) const;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user