From d54273b2cb597a787a0a84bd3a26ca75a113a0a9 Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Sat, 5 Jul 2025 18:22:11 -0400 Subject: [PATCH] texture usage flags --- .../vulkan_graphics_pipeline.c | 4 +++- .../apis/vulkan/src/textures/vulkan_texture.c | 18 +++++++++++++----- .../gryphn_graphics_pipeline.h | 6 ++++++ projects/core/src/textures/gryphn_texture.h | 9 +++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/projects/apis/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c b/projects/apis/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c index a4cc0e7..f4d6929 100644 --- a/projects/apis/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c +++ b/projects/apis/vulkan/src/pipelines/graphics_pipeline/vulkan_graphics_pipeline.c @@ -1,9 +1,11 @@ #include "vulkan_graphics_pipeline.h" #include "output_device/vulkan_output_devices.h" +#include "output_device/vulkan_physical_device.h" #include "shader_module/vulkan_shader_module.h" #include "renderpass/vulkan_render_pass_descriptor.h" #include "uniforms/vulkan_uniform_layout.h" + VkDynamicState vkGryphnDynamicStateToVulkanDynamicState(gnDynamicState state) { switch (state) { case GN_DYNAMIC_VIEWPORT: return VK_DYNAMIC_STATE_VIEWPORT; @@ -177,7 +179,7 @@ gnReturnCode createGraphicsPipeline(gnGraphicsPipeline graphicsPipeline, gnDevic VkPipelineMultisampleStateCreateInfo multisampling = { .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, .sampleShadingEnable = VK_FALSE, - .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT + .rasterizationSamples = gnSampleCountToVulkan(info.multisample.samples) }; graphicsPipeline->graphicsPipeline->colorBlendAttachment = (VkPipelineColorBlendAttachmentState){ diff --git a/projects/apis/vulkan/src/textures/vulkan_texture.c b/projects/apis/vulkan/src/textures/vulkan_texture.c index 12d7f6a..797f909 100644 --- a/projects/apis/vulkan/src/textures/vulkan_texture.c +++ b/projects/apis/vulkan/src/textures/vulkan_texture.c @@ -24,6 +24,18 @@ VkSamplerAddressMode vkGryphnTextureWrap(gnTextureWrap wrap) { } } +VkImageUsageFlags gnImageUsageToVulkan(gnTextureUsageFlags flags) { + VkImageUsageFlags vkFlags = 0; + + if ((flags & GN_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT) == GN_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT) vkFlags |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + if ((flags & GN_TEXTURE_USAGE_COLOR_ATTACHMENT) == GN_TEXTURE_USAGE_COLOR_ATTACHMENT) vkFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + if ((flags & GN_TEXTURE_USAGE_SAMPLED) == GN_TEXTURE_USAGE_SAMPLED) vkFlags |= VK_IMAGE_USAGE_SAMPLED_BIT; + if ((flags & GN_TEXTURE_USAGE_WRITE_TARGET) == GN_TEXTURE_USAGE_WRITE_TARGET) vkFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + if ((flags & GN_TEXTURE_RESOLVE_ATTACHMENT) == GN_TEXTURE_RESOLVE_ATTACHMENT) vkFlags |= VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; + + return vkFlags; +} + VkImageAspectFlags vkGryphnGetAspectFlags(gnImageFormat format) { VkImageAspectFlags aspectMask = 0; @@ -147,6 +159,7 @@ gnReturnCode createTexture(gnTexture texture, gnDevice device, const gnTextureIn .tiling = VK_IMAGE_TILING_OPTIMAL, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, .samples = gnSampleCountToVulkan(info.samples), + .usage = gnImageUsageToVulkan(info.usage), .extent = { .width = info.extent.width, .height = info.extent.height, @@ -158,11 +171,6 @@ gnReturnCode createTexture(gnTexture texture, gnDevice device, const gnTextureIn .format = vkGryphnFormatToVulkanFormat(info.format) }; - if (vkGryphnIsDepthStencil(info.format)) - imageInfo.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; - else - imageInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; - VkResult res = vkCreateImage(device->outputDevice->device, &imageInfo, NULL, &texture->texture->image.image); if (res == VK_ERROR_FORMAT_NOT_SUPPORTED) return GN_UNSUPPORTED_IMAGE_FORMAT; else if (res != VK_SUCCESS) return GN_FAILED_TO_CREATE_IMAGE; diff --git a/projects/core/src/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h b/projects/core/src/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h index f1f4aff..6b8d84f 100644 --- a/projects/core/src/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h +++ b/projects/core/src/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h @@ -46,6 +46,10 @@ typedef struct gnScissor { gnUInt2 size; } gnScissor; +typedef struct gnMultisample { + gnMultisampleCountFlags samples; +} gnMultisample; + typedef enum gnFillMode { GN_FILL_MODE_FILL, GN_FILL_MODE_LINE, GN_FILL_MODE_POINT } gnFillMode; @@ -118,6 +122,8 @@ typedef struct gnGraphicsPipelineInfo { gnShaderInputLayout shaderInputLayout; gnUniformLayout uniformLayout; + + gnMultisample multisample; } gnGraphicsPipelineInfo; #ifdef GN_REVEAL_IMPL diff --git a/projects/core/src/textures/gryphn_texture.h b/projects/core/src/textures/gryphn_texture.h index ee1f4db..4b6346a 100644 --- a/projects/core/src/textures/gryphn_texture.h +++ b/projects/core/src/textures/gryphn_texture.h @@ -17,9 +17,18 @@ typedef enum gnTextureWrap { GN_REPEAT, GN_MIRRORED_REPEAT, GN_CLAMP_TO_EDGE, GN_CLAMP_TO_BORDER } gnTextureWrap; +typedef enum gnTextureUsageFlags { + GN_TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT = 1 << 0, + GN_TEXTURE_USAGE_COLOR_ATTACHMENT = 1 << 1, + GN_TEXTURE_USAGE_SAMPLED = 1 << 2, + GN_TEXTURE_USAGE_WRITE_TARGET = 1 << 3, + GN_TEXTURE_RESOLVE_ATTACHMENT = 1 << 4 +} gnTextureUsageFlags; + typedef struct gnTextureInfo { gnExtent3D extent; gnMultisampleCountFlags samples; + gnTextureUsageFlags usage; uint32_t mipmapLevels; gnTextureType type; gnImageFormat format;