mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-04 05:51:27 +12:00
vulkan: Move sampler object outside of texture.
This commit is contained in:
parent
6f9f5f7918
commit
a14dd8ea51
3 changed files with 49 additions and 69 deletions
|
@ -562,7 +562,13 @@ void VKGSRender::end()
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::texture &tex = (texture0)? (*texture0): m_texture_cache.upload_texture(m_command_buffer, textures[i], m_rtts);
|
vk::texture &tex = (texture0)? (*texture0): m_texture_cache.upload_texture(m_command_buffer, textures[i], m_rtts);
|
||||||
m_program->bind_uniform({ tex, tex, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "tex" + std::to_string(i), descriptor_sets);
|
vk::sampler sampler(*m_device,
|
||||||
|
vk::vk_wrap_mode(textures[i].wrap_s()), vk::vk_wrap_mode(textures[i].wrap_t()), vk::vk_wrap_mode(textures[i].wrap_r()),
|
||||||
|
!!(textures[i].format() & CELL_GCM_TEXTURE_UN),
|
||||||
|
textures[i].bias(), vk::max_aniso(textures[i].max_aniso()), textures[i].min_lod(), textures[i].max_lod(),
|
||||||
|
VK_FILTER_LINEAR, VK_FILTER_LINEAR, VK_SAMPLER_MIPMAP_MODE_NEAREST
|
||||||
|
);
|
||||||
|
m_program->bind_uniform({ sampler.value, tex, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, "tex" + std::to_string(i), descriptor_sets);
|
||||||
texture0 = &tex;
|
texture0 = &tex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -335,7 +335,6 @@ namespace vk
|
||||||
class texture
|
class texture
|
||||||
{
|
{
|
||||||
VkImageView m_view = nullptr;
|
VkImageView m_view = nullptr;
|
||||||
VkSampler m_sampler = nullptr;
|
|
||||||
VkImage m_image_contents = nullptr;
|
VkImage m_image_contents = nullptr;
|
||||||
VkMemoryRequirements m_memory_layout;
|
VkMemoryRequirements m_memory_layout;
|
||||||
VkFormat m_internal_format;
|
VkFormat m_internal_format;
|
||||||
|
@ -355,7 +354,6 @@ namespace vk
|
||||||
|
|
||||||
vk::texture *staging_texture = nullptr;
|
vk::texture *staging_texture = nullptr;
|
||||||
bool ready = false;
|
bool ready = false;
|
||||||
void sampler_setup(rsx::texture& tex, VkImageViewType type, VkComponentMapping swizzle);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
texture(vk::swap_chain_image &img);
|
texture(vk::swap_chain_image &img);
|
||||||
|
@ -381,7 +379,6 @@ namespace vk
|
||||||
const u16 mipmaps();
|
const u16 mipmaps();
|
||||||
const VkFormat get_format();
|
const VkFormat get_format();
|
||||||
|
|
||||||
operator VkSampler();
|
|
||||||
operator VkImageView();
|
operator VkImageView();
|
||||||
operator VkImage();
|
operator VkImage();
|
||||||
};
|
};
|
||||||
|
@ -462,6 +459,48 @@ namespace vk
|
||||||
VkDevice m_device;
|
VkDevice m_device;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct sampler
|
||||||
|
{
|
||||||
|
VkSampler value;
|
||||||
|
VkSamplerCreateInfo info = {};
|
||||||
|
|
||||||
|
sampler(VkDevice dev, VkSamplerAddressMode clamp_u, VkSamplerAddressMode clamp_v, VkSamplerAddressMode clamp_w,
|
||||||
|
bool unnormalized_coordinates, float mipLodBias, float max_anisotropy, float min_lod, float max_lod,
|
||||||
|
VkFilter min_filter, VkFilter mag_filter, VkSamplerMipmapMode mipmap_mode)
|
||||||
|
: m_device(dev)
|
||||||
|
{
|
||||||
|
VkSamplerCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
||||||
|
info.addressModeU = clamp_u;
|
||||||
|
info.addressModeV = clamp_v;
|
||||||
|
info.addressModeW = clamp_w;
|
||||||
|
info.anisotropyEnable = VK_TRUE;
|
||||||
|
info.compareEnable = VK_FALSE;
|
||||||
|
info.unnormalizedCoordinates = unnormalized_coordinates;
|
||||||
|
info.mipLodBias = mipLodBias;
|
||||||
|
info.maxAnisotropy = max_anisotropy;
|
||||||
|
info.maxLod = max_lod;
|
||||||
|
info.minLod = min_lod;
|
||||||
|
info.magFilter = mag_filter;
|
||||||
|
info.minFilter = min_filter;
|
||||||
|
info.mipmapMode = mipmap_mode;
|
||||||
|
info.compareOp = VK_COMPARE_OP_NEVER;
|
||||||
|
info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
||||||
|
|
||||||
|
CHECK_RESULT(vkCreateSampler(m_device, &info, nullptr, &value));
|
||||||
|
}
|
||||||
|
|
||||||
|
~sampler()
|
||||||
|
{
|
||||||
|
vkDestroySampler(m_device, value, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
sampler(const sampler&) = delete;
|
||||||
|
sampler(sampler&&) = delete;
|
||||||
|
private:
|
||||||
|
VkDevice m_device;
|
||||||
|
};
|
||||||
|
|
||||||
class framebuffer
|
class framebuffer
|
||||||
{
|
{
|
||||||
VkFramebuffer m_vk_framebuffer = nullptr;
|
VkFramebuffer m_vk_framebuffer = nullptr;
|
||||||
|
|
|
@ -133,7 +133,6 @@ namespace vk
|
||||||
{
|
{
|
||||||
m_image_contents = img;
|
m_image_contents = img;
|
||||||
m_view = img;
|
m_view = img;
|
||||||
m_sampler = nullptr;
|
|
||||||
|
|
||||||
//We did not create this object, do not allow internal modification!
|
//We did not create this object, do not allow internal modification!
|
||||||
owner = nullptr;
|
owner = nullptr;
|
||||||
|
@ -190,32 +189,6 @@ namespace vk
|
||||||
m_usage = usage;
|
m_usage = usage;
|
||||||
m_tiling = tiling;
|
m_tiling = tiling;
|
||||||
|
|
||||||
if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT ||
|
|
||||||
usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
|
|
||||||
{
|
|
||||||
VkSamplerAddressMode clamp_s = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
|
||||||
VkSamplerAddressMode clamp_t = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
|
||||||
VkSamplerAddressMode clamp_r = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
|
||||||
|
|
||||||
VkSamplerCreateInfo sampler_info = {};
|
|
||||||
sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
|
||||||
sampler_info.addressModeU = clamp_s;
|
|
||||||
sampler_info.addressModeV = clamp_t;
|
|
||||||
sampler_info.addressModeW = clamp_r;
|
|
||||||
sampler_info.anisotropyEnable = VK_FALSE;
|
|
||||||
sampler_info.compareEnable = VK_FALSE;
|
|
||||||
sampler_info.unnormalizedCoordinates = VK_FALSE;
|
|
||||||
sampler_info.mipLodBias = 0;
|
|
||||||
sampler_info.maxAnisotropy = 0;
|
|
||||||
sampler_info.magFilter = VK_FILTER_LINEAR;
|
|
||||||
sampler_info.minFilter = VK_FILTER_LINEAR;
|
|
||||||
sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
|
|
||||||
sampler_info.compareOp = VK_COMPARE_OP_NEVER;
|
|
||||||
sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
|
||||||
|
|
||||||
CHECK_RESULT(vkCreateSampler((*owner), &sampler_info, nullptr, &m_sampler));
|
|
||||||
}
|
|
||||||
|
|
||||||
ready = true;
|
ready = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,33 +242,6 @@ namespace vk
|
||||||
create(device, format, usage, tiling, width, height, mipmaps, gpu_only, swizzle);
|
create(device, format, usage, tiling, width, height, mipmaps, gpu_only, swizzle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void texture::sampler_setup(rsx::texture &tex, VkImageViewType type, VkComponentMapping swizzle)
|
|
||||||
{
|
|
||||||
VkSamplerAddressMode clamp_s = vk::vk_wrap_mode(tex.wrap_s());
|
|
||||||
VkSamplerAddressMode clamp_t = vk::vk_wrap_mode(tex.wrap_t());
|
|
||||||
VkSamplerAddressMode clamp_r = vk::vk_wrap_mode(tex.wrap_r());
|
|
||||||
|
|
||||||
VkSamplerCreateInfo sampler_info = {};
|
|
||||||
sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
|
||||||
sampler_info.addressModeU = clamp_s;
|
|
||||||
sampler_info.addressModeV = clamp_t;
|
|
||||||
sampler_info.addressModeW = clamp_r;
|
|
||||||
sampler_info.anisotropyEnable = VK_TRUE;
|
|
||||||
sampler_info.compareEnable = VK_FALSE;
|
|
||||||
sampler_info.unnormalizedCoordinates = !!(tex.format() & CELL_GCM_TEXTURE_UN);
|
|
||||||
sampler_info.mipLodBias = tex.bias();
|
|
||||||
sampler_info.maxAnisotropy = vk::max_aniso(tex.max_aniso());
|
|
||||||
sampler_info.maxLod = tex.max_lod();
|
|
||||||
sampler_info.minLod = tex.min_lod();
|
|
||||||
sampler_info.magFilter = VK_FILTER_LINEAR;
|
|
||||||
sampler_info.minFilter = VK_FILTER_LINEAR;
|
|
||||||
sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
|
|
||||||
sampler_info.compareOp = VK_COMPARE_OP_NEVER;
|
|
||||||
sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
|
||||||
|
|
||||||
CHECK_RESULT(vkCreateSampler((*owner), &sampler_info, nullptr, &m_sampler));
|
|
||||||
}
|
|
||||||
|
|
||||||
void texture::init(rsx::texture& tex, vk::command_buffer &cmd, bool ignore_checks)
|
void texture::init(rsx::texture& tex, vk::command_buffer &cmd, bool ignore_checks)
|
||||||
{
|
{
|
||||||
VkImageViewType best_type = VK_IMAGE_VIEW_TYPE_2D;
|
VkImageViewType best_type = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
|
@ -324,9 +270,6 @@ namespace vk
|
||||||
create(dev, format, VK_IMAGE_TYPE_3D, VK_IMAGE_VIEW_TYPE_3D, 0, usage, tiling, tex.width(), tex.height(), tex.mipmap(), false, default_component_map());
|
create(dev, format, VK_IMAGE_TYPE_3D, VK_IMAGE_VIEW_TYPE_3D, 0, usage, tiling, tex.width(), tex.height(), tex.mipmap(), false, default_component_map());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_sampler)
|
|
||||||
sampler_setup(tex, best_type, default_component_map());
|
|
||||||
|
|
||||||
VkImageSubresource subres = {};
|
VkImageSubresource subres = {};
|
||||||
subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
subres.mipLevel = 0;
|
subres.mipLevel = 0;
|
||||||
|
@ -495,9 +438,6 @@ namespace vk
|
||||||
{
|
{
|
||||||
if (!owner) return;
|
if (!owner) return;
|
||||||
|
|
||||||
if (m_sampler)
|
|
||||||
vkDestroySampler((*owner), m_sampler, nullptr);
|
|
||||||
|
|
||||||
//Destroy all objects managed by this object
|
//Destroy all objects managed by this object
|
||||||
vkDestroyImageView((*owner), m_view, nullptr);
|
vkDestroyImageView((*owner), m_view, nullptr);
|
||||||
vkDestroyImage((*owner), m_image_contents, nullptr);
|
vkDestroyImage((*owner), m_image_contents, nullptr);
|
||||||
|
@ -505,7 +445,6 @@ namespace vk
|
||||||
vram_allocation.destroy();
|
vram_allocation.destroy();
|
||||||
|
|
||||||
owner = nullptr;
|
owner = nullptr;
|
||||||
m_sampler = nullptr;
|
|
||||||
m_view = nullptr;
|
m_view = nullptr;
|
||||||
m_image_contents = nullptr;
|
m_image_contents = nullptr;
|
||||||
|
|
||||||
|
@ -532,8 +471,4 @@ namespace vk
|
||||||
return m_view;
|
return m_view;
|
||||||
}
|
}
|
||||||
|
|
||||||
texture::operator VkSampler()
|
|
||||||
{
|
|
||||||
return m_sampler;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue