texture usage flags

This commit is contained in:
Greg Wells
2025-07-05 18:22:11 -04:00
parent d567ce0beb
commit d54273b2cb
4 changed files with 31 additions and 6 deletions

View File

@@ -1,9 +1,11 @@
#include "vulkan_graphics_pipeline.h" #include "vulkan_graphics_pipeline.h"
#include "output_device/vulkan_output_devices.h" #include "output_device/vulkan_output_devices.h"
#include "output_device/vulkan_physical_device.h"
#include "shader_module/vulkan_shader_module.h" #include "shader_module/vulkan_shader_module.h"
#include "renderpass/vulkan_render_pass_descriptor.h" #include "renderpass/vulkan_render_pass_descriptor.h"
#include "uniforms/vulkan_uniform_layout.h" #include "uniforms/vulkan_uniform_layout.h"
VkDynamicState vkGryphnDynamicStateToVulkanDynamicState(gnDynamicState state) { VkDynamicState vkGryphnDynamicStateToVulkanDynamicState(gnDynamicState state) {
switch (state) { switch (state) {
case GN_DYNAMIC_VIEWPORT: return VK_DYNAMIC_STATE_VIEWPORT; case GN_DYNAMIC_VIEWPORT: return VK_DYNAMIC_STATE_VIEWPORT;
@@ -177,7 +179,7 @@ gnReturnCode createGraphicsPipeline(gnGraphicsPipeline graphicsPipeline, gnDevic
VkPipelineMultisampleStateCreateInfo multisampling = { VkPipelineMultisampleStateCreateInfo multisampling = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
.sampleShadingEnable = VK_FALSE, .sampleShadingEnable = VK_FALSE,
.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT .rasterizationSamples = gnSampleCountToVulkan(info.multisample.samples)
}; };
graphicsPipeline->graphicsPipeline->colorBlendAttachment = (VkPipelineColorBlendAttachmentState){ graphicsPipeline->graphicsPipeline->colorBlendAttachment = (VkPipelineColorBlendAttachmentState){

View File

@@ -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 vkGryphnGetAspectFlags(gnImageFormat format) {
VkImageAspectFlags aspectMask = 0; VkImageAspectFlags aspectMask = 0;
@@ -147,6 +159,7 @@ gnReturnCode createTexture(gnTexture texture, gnDevice device, const gnTextureIn
.tiling = VK_IMAGE_TILING_OPTIMAL, .tiling = VK_IMAGE_TILING_OPTIMAL,
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
.samples = gnSampleCountToVulkan(info.samples), .samples = gnSampleCountToVulkan(info.samples),
.usage = gnImageUsageToVulkan(info.usage),
.extent = { .extent = {
.width = info.extent.width, .width = info.extent.width,
.height = info.extent.height, .height = info.extent.height,
@@ -158,11 +171,6 @@ gnReturnCode createTexture(gnTexture texture, gnDevice device, const gnTextureIn
.format = vkGryphnFormatToVulkanFormat(info.format) .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); VkResult res = vkCreateImage(device->outputDevice->device, &imageInfo, NULL, &texture->texture->image.image);
if (res == VK_ERROR_FORMAT_NOT_SUPPORTED) return GN_UNSUPPORTED_IMAGE_FORMAT; if (res == VK_ERROR_FORMAT_NOT_SUPPORTED) return GN_UNSUPPORTED_IMAGE_FORMAT;
else if (res != VK_SUCCESS) return GN_FAILED_TO_CREATE_IMAGE; else if (res != VK_SUCCESS) return GN_FAILED_TO_CREATE_IMAGE;

View File

@@ -46,6 +46,10 @@ typedef struct gnScissor {
gnUInt2 size; gnUInt2 size;
} gnScissor; } gnScissor;
typedef struct gnMultisample {
gnMultisampleCountFlags samples;
} gnMultisample;
typedef enum gnFillMode { typedef enum gnFillMode {
GN_FILL_MODE_FILL, GN_FILL_MODE_LINE, GN_FILL_MODE_POINT GN_FILL_MODE_FILL, GN_FILL_MODE_LINE, GN_FILL_MODE_POINT
} gnFillMode; } gnFillMode;
@@ -118,6 +122,8 @@ typedef struct gnGraphicsPipelineInfo {
gnShaderInputLayout shaderInputLayout; gnShaderInputLayout shaderInputLayout;
gnUniformLayout uniformLayout; gnUniformLayout uniformLayout;
gnMultisample multisample;
} gnGraphicsPipelineInfo; } gnGraphicsPipelineInfo;
#ifdef GN_REVEAL_IMPL #ifdef GN_REVEAL_IMPL

View File

@@ -17,9 +17,18 @@ typedef enum gnTextureWrap {
GN_REPEAT, GN_MIRRORED_REPEAT, GN_CLAMP_TO_EDGE, GN_CLAMP_TO_BORDER GN_REPEAT, GN_MIRRORED_REPEAT, GN_CLAMP_TO_EDGE, GN_CLAMP_TO_BORDER
} gnTextureWrap; } 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 { typedef struct gnTextureInfo {
gnExtent3D extent; gnExtent3D extent;
gnMultisampleCountFlags samples; gnMultisampleCountFlags samples;
gnTextureUsageFlags usage;
uint32_t mipmapLevels; uint32_t mipmapLevels;
gnTextureType type; gnTextureType type;
gnImageFormat format; gnImageFormat format;