Vulkan: Changed attachment boolean to flags

This commit is contained in:
korenkonder
2025-05-17 12:37:21 +03:00
parent 606b4e0db5
commit 2137fa7b7d
2 changed files with 27 additions and 16 deletions
+19 -14
View File
@@ -344,7 +344,8 @@ namespace Vulkan {
vk_fbo->color_attachment_image_views[i].Destroy();
for (int32_t i = 0; i < Vulkan::MAX_COLOR_ATTACHMENTS; i++) {
gl_texture* vk_tex = gl_texture::get(vk_fbo->color_attachments[i], true, true);
gl_texture* vk_tex = gl_texture::get(
vk_fbo->color_attachments[i], true, Vulkan::GL_TEXTURE_ATTACHMENT);
if (vk_tex && vk_tex->get_level_count() > 0) {
const VkImageViewType image_view_type = Vulkan::get_image_view_type(vk_tex->target);
const VkFormat format = Vulkan::get_format(vk_tex->internal_format);
@@ -363,7 +364,8 @@ namespace Vulkan {
if (vk_fbo->update_depth_attachment) {
vk_fbo->depth_attachment_image_view.Destroy();
gl_texture* vk_tex = gl_texture::get(vk_fbo->depth_attachment, true, true);
gl_texture* vk_tex = gl_texture::get(
vk_fbo->depth_attachment, true, Vulkan::GL_TEXTURE_ATTACHMENT);
if (vk_tex && vk_tex->get_level_count() > 0) {
const VkImageViewType image_view_type = Vulkan::get_image_view_type(vk_tex->target);
const VkFormat format = Vulkan::get_format(vk_tex->internal_format);
@@ -389,7 +391,7 @@ namespace Vulkan {
for (uint32_t i = 0; i < Vulkan::MAX_DRAW_BUFFERS; i++) {
GLuint texture = vk_fbo->get_draw_buffer_texture(i);
gl_texture* vk_tex = gl_texture::get(texture, true, true);
gl_texture* vk_tex = gl_texture::get(texture, true, Vulkan::GL_TEXTURE_ATTACHMENT);
if (!vk_tex)
continue;
@@ -413,7 +415,8 @@ namespace Vulkan {
GLenum depth_format = GL_ZERO;
if (vk_fbo->depth_attachment) {
gl_texture* vk_tex = gl_texture::get(vk_fbo->depth_attachment, true, true);
gl_texture* vk_tex = gl_texture::get(
vk_fbo->depth_attachment, true, Vulkan::GL_TEXTURE_ATTACHMENT);
if (vk_tex) {
depth_format = vk_tex->internal_format;
image_views[image_view_count] = vk_tex->image_view;
@@ -982,7 +985,7 @@ namespace Vulkan {
}
gl_texture::gl_texture() : target(), base_mipmap_level(), internal_format(),
width(), height(), level_count(), components(), attachment() {
width(), height(), level_count(), components(), flags() {
max_mipmap_level = 1000;
}
@@ -990,7 +993,7 @@ namespace Vulkan {
return sample_image_view ? sample_image_view : image_view;
}
gl_texture* gl_texture::get(GLuint texture, bool update_data, bool attachment) {
gl_texture* gl_texture::get(GLuint texture, bool update_data, gl_texture_flags flags) {
if (!texture)
return 0;
@@ -1015,7 +1018,7 @@ namespace Vulkan {
|| vk_tex->width != vk_tex_data->width
|| vk_tex->height != vk_tex_data->height
|| vk_tex->level_count != vk_tex_data->level_count)
|| attachment && vk_tex->attachment != attachment)
|| flags && vk_tex->flags != flags)
create = true;
if (create && update_data) {
@@ -1028,7 +1031,7 @@ namespace Vulkan {
vk_tex->level_count = vk_tex_data->level_count;
}
vk_tex->attachment = attachment;
vk_tex->flags = flags;
const VkImageViewType image_view_type = Vulkan::get_image_view_type(vk_tex->target);
const VkFormat format = Vulkan::get_format(vk_tex->internal_format);
@@ -1039,7 +1042,7 @@ namespace Vulkan {
switch (format) {
case VK_FORMAT_D24_UNORM_S8_UINT:
case VK_FORMAT_D32_SFLOAT:
if (vk_tex->attachment) {
if (vk_tex->flags & Vulkan::GL_TEXTURE_ATTACHMENT) {
usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
}
@@ -1047,7 +1050,7 @@ namespace Vulkan {
layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
break;
default:
if (vk_tex->attachment) {
if (vk_tex->flags & Vulkan::GL_TEXTURE_ATTACHMENT) {
usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
}
@@ -1067,7 +1070,7 @@ namespace Vulkan {
vk_tex->image.Create(Vulkan::current_allocator,
flags, vk_tex->width, vk_tex->height, level_count, layer_count, format,
VK_IMAGE_TILING_OPTIMAL, usage, VMA_MEMORY_USAGE_AUTO,
vk_tex->attachment ? VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT : 0);
(vk_tex->flags & Vulkan::GL_TEXTURE_ATTACHMENT) ? VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT : 0);
vk_tex->image_view.Create(Vulkan::current_device, 0, vk_tex->image,
image_view_type, format, aspect_mask, 0, level_count, 0, layer_count);
Vulkan::Image::PipelineBarrier(Vulkan::current_command_buffer, vk_tex->image,
@@ -3098,7 +3101,8 @@ namespace Vulkan {
GLuint color_attachment = vk_fbo->color_attachments[draw_buffer - GL_COLOR_ATTACHMENT0];
if (color_attachment) {
Vulkan::gl_texture* vk_tex = Vulkan::gl_texture::get(color_attachment, true, true);
Vulkan::gl_texture* vk_tex = Vulkan::gl_texture::get(
color_attachment, true, Vulkan::GL_TEXTURE_ATTACHMENT);
Vulkan::Image::PipelineBarrier(Vulkan::current_command_buffer,
vk_tex->image, Vulkan::get_aspect_mask(vk_tex->internal_format),
vk_tex->level_count, 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
@@ -3106,7 +3110,8 @@ namespace Vulkan {
}
if (vk_fbo->depth_attachment) {
Vulkan::gl_texture* vk_tex = Vulkan::gl_texture::get(vk_fbo->depth_attachment, true, true);
Vulkan::gl_texture* vk_tex = Vulkan::gl_texture::get(
vk_fbo->depth_attachment, true, Vulkan::GL_TEXTURE_ATTACHMENT);
const VkImageLayout layout = depth_stencil_state.depthWriteEnable
|| depth_stencil_state.stencilTestEnable
? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
@@ -4881,7 +4886,7 @@ namespace Vulkan {
return;
}
gl_texture* vk_tex = gl_texture::get(texture, false, true);
gl_texture* vk_tex = gl_texture::get(texture, true, Vulkan::GL_TEXTURE_ATTACHMENT);
gl_texture_data* vk_tex_data = gl_texture_data::get(texture);
if (texture && (!vk_tex || level >= (int64_t)vk_tex->level_count && (!vk_tex_data
|| !vk_tex_data->valid() || level >= (int64_t)vk_tex_data->level_count))) {
+8 -2
View File
@@ -42,6 +42,11 @@ namespace Vulkan {
GL_BUFFER_FLAG_DYNAMIC_STORAGE_BIT = 0x20,
};
enum gl_texture_flags {
GL_TEXTURE_NONE = (0 << 0u),
GL_TEXTURE_ATTACHMENT = (1 << 0u),
};
struct gl_buffer {
GLenum target;
gl_buffer_flags flags;
@@ -230,14 +235,15 @@ namespace Vulkan {
Vulkan::ImageView sample_image_view;
uint32_t level_count;
VkComponentMapping components;
bool attachment;
gl_texture_flags flags;
gl_sampler sampler_data;
gl_texture();
VkImageView get_image_view();
static gl_texture* get(GLuint texture, bool update_data = true, bool attachment = false);
static gl_texture* get(GLuint texture, bool update_data = true,
gl_texture_flags attachment = GL_TEXTURE_NONE);
inline uint32_t get_layer_count() const {
return target == GL_TEXTURE_CUBE_MAP ? 6 : 1;