rgba textures and binding the decriptor sets

This commit is contained in:
Gregory Wells
2025-06-14 22:08:29 -04:00
parent 012e842e1d
commit 7071d01835
10 changed files with 44 additions and 7 deletions

View File

@@ -4,11 +4,11 @@
VkShaderStageFlagBits vkGryphnShaderModuleStage(gnShaderModuleStage stage) { VkShaderStageFlagBits vkGryphnShaderModuleStage(gnShaderModuleStage stage) {
VkShaderStageFlagBits outStage = 0; VkShaderStageFlagBits outStage = 0;
switch(stage) {
case GN_VERTEX_SHADER_MODULE: outStage |= VK_SHADER_STAGE_VERTEX_BIT; break; if ((stage & GN_VERTEX_SHADER_MODULE) == GN_VERTEX_SHADER_MODULE) outStage |= VK_SHADER_STAGE_VERTEX_BIT;
case GN_FRAGMENT_SHADER_MODULE: outStage |= VK_SHADER_STAGE_FRAGMENT_BIT; break; if ((stage & GN_FRAGMENT_SHADER_MODULE) == GN_FRAGMENT_SHADER_MODULE) outStage |= VK_SHADER_STAGE_FRAGMENT_BIT;
case GN_ALL_SHADER_MODULE: return VK_SHADER_STAGE_ALL_GRAPHICS; if ((stage & GN_ALL_SHADER_MODULE) == GN_ALL_SHADER_MODULE) return VK_SHADER_STAGE_ALL_GRAPHICS;
}
return outStage; return outStage;
} }

View File

@@ -6,7 +6,7 @@
VkImageType vkGryphnTextureType(gnTextureType type) { VkImageType vkGryphnTextureType(gnTextureType type) {
switch(type) { switch(type) {
case GN_TEXTURE_2D: return VK_IMAGE_TYPE_2D; case GN_TEXTURE_2D: return VK_IMAGE_TYPE_2D;
} }
} }
@@ -114,6 +114,7 @@ gnReturnCode gnCreateTextureFn(gnTexture texture, gnDevice device, const gnTextu
size_t imageSize = info.width * info.height; size_t imageSize = info.width * info.height;
if (info.format == GN_FORMAT_BGRA8_SRGB) { imageSize *= 4; } if (info.format == GN_FORMAT_BGRA8_SRGB) { imageSize *= 4; }
if (info.format == GN_FORMAT_RGBA8_SRGB) { imageSize *= 4; }
gnReturnCode staginBufferCreateCode = VkCreateBuffer( gnReturnCode staginBufferCreateCode = VkCreateBuffer(
&texture->texture->buffer, imageSize, device, &texture->texture->buffer, imageSize, device,

View File

@@ -2,6 +2,7 @@
#include "buffers/vulkan_buffer.h" #include "buffers/vulkan_buffer.h"
#include "output_device/vulkan_output_devices.h" #include "output_device/vulkan_output_devices.h"
#include "core/uniforms/gryphn_uniform_pool.h" #include "core/uniforms/gryphn_uniform_pool.h"
#include "textures/vulkan_texture.h"
void gnUpdateBufferUniformFn(gnUniform uniform, gnBufferUniformInfo* info) { void gnUpdateBufferUniformFn(gnUniform uniform, gnBufferUniformInfo* info) {
VkDescriptorBufferInfo bufferInfo = { VkDescriptorBufferInfo bufferInfo = {
@@ -22,3 +23,23 @@ void gnUpdateBufferUniformFn(gnUniform uniform, gnBufferUniformInfo* info) {
vkUpdateDescriptorSets(uniform->pool->device->outputDevice->device, 1, &write, 0, NULL); vkUpdateDescriptorSets(uniform->pool->device->outputDevice->device, 1, &write, 0, NULL);
} }
void gnUpdateImageUniformFn(gnUniform uniform, gnImageUniformInfo* info) {
VkDescriptorImageInfo imageInfo = {
.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
.imageView = info->texture->texture->image.imageView,
.sampler = info->texture->texture->sampler
};
VkWriteDescriptorSet write = {
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
.descriptorCount = 1,
.pImageInfo = &imageInfo,
.dstSet = uniform->uniform->set,
.dstBinding = info->binding,
.dstArrayElement = 0
};
vkUpdateDescriptorSets(uniform->pool->device->outputDevice->device, 1, &write, 0, NULL);
}

View File

@@ -4,6 +4,7 @@
VkDescriptorType vkGryphnUniformType(gnUniformType type) { VkDescriptorType vkGryphnUniformType(gnUniformType type) {
switch(type) { switch(type) {
case GN_UNIFORM_BUFFER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; case GN_UNIFORM_BUFFER_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
case GN_IMAGE_DESCRIPTOR: return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
case GN_UNIFORM_TYPE_MAX: return VK_DESCRIPTOR_TYPE_MAX_ENUM; case GN_UNIFORM_TYPE_MAX: return VK_DESCRIPTOR_TYPE_MAX_ENUM;
} }
} }

View File

@@ -110,7 +110,8 @@ gnSurfaceDetails gnGetSurfaceDetailsFn(
VkFormat vkGryphnFormatToVulkanFormat(gnImageFormat format) { VkFormat vkGryphnFormatToVulkanFormat(gnImageFormat format) {
switch (format) { switch (format) {
case GN_FORMAT_BGRA8_SRGB: { return VK_FORMAT_B8G8R8A8_SRGB; } case GN_FORMAT_BGRA8_SRGB: return VK_FORMAT_B8G8R8A8_SRGB;
case GN_FORMAT_RGBA8_SRGB: return VK_FORMAT_R8G8B8A8_SRGB;
default: return VK_FORMAT_UNDEFINED; default: return VK_FORMAT_UNDEFINED;
} }
} }

View File

@@ -91,6 +91,7 @@ typedef struct gnDeviceFunctions_t {
void (*_gnDestroyUniformPool)(gnUniformPool pool); void (*_gnDestroyUniformPool)(gnUniformPool pool);
void (*_gnUpdateBufferUniform)(gnUniform uniform, gnBufferUniformInfo* bufferInfo); void (*_gnUpdateBufferUniform)(gnUniform uniform, gnBufferUniformInfo* bufferInfo);
void (*_gnUpdateImageUniform)(gnUniform uniform, gnImageUniformInfo* imageInfo);
gnReturnCode (*_gnCreateTexture)(gnTexture texture, gnDevice device, const gnTextureInfo info); gnReturnCode (*_gnCreateTexture)(gnTexture texture, gnDevice device, const gnTextureInfo info);
void (*_gnTextureData)(gnTextureHandle texture, void* pixelData); void (*_gnTextureData)(gnTextureHandle texture, void* pixelData);

View File

@@ -93,6 +93,7 @@ void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFuncti
gnLoadDLLFunction(lib, functions->_gnUniformPoolAllocateUniforms, "gnUniformPoolAllocateUniformsFn"); gnLoadDLLFunction(lib, functions->_gnUniformPoolAllocateUniforms, "gnUniformPoolAllocateUniformsFn");
gnLoadDLLFunction(lib, functions->_gnDestroyUniformPool, "gnDestroyUniformPoolFn"); gnLoadDLLFunction(lib, functions->_gnDestroyUniformPool, "gnDestroyUniformPoolFn");
gnLoadDLLFunction(lib, functions->_gnUpdateBufferUniform, "gnUpdateBufferUniformFn"); gnLoadDLLFunction(lib, functions->_gnUpdateBufferUniform, "gnUpdateBufferUniformFn");
gnLoadDLLFunction(lib, functions->_gnUpdateImageUniform, "gnUpdateImageUniformFn");
gnLoadDLLFunction(lib, functions->_gnCreateTexture, "gnCreateTextureFn"); gnLoadDLLFunction(lib, functions->_gnCreateTexture, "gnCreateTextureFn");
gnLoadDLLFunction(lib, functions->_gnTextureData, "gnTextureDataFn"); gnLoadDLLFunction(lib, functions->_gnTextureData, "gnTextureDataFn");
gnLoadDLLFunction(lib, functions->_gnDestroyTexture, "gnDestroyTextureFn"); gnLoadDLLFunction(lib, functions->_gnDestroyTexture, "gnDestroyTextureFn");

View File

@@ -6,3 +6,7 @@
void gnUpdateBufferUniform(gnUniform uniform, gnBufferUniformInfo bufferInfo) { void gnUpdateBufferUniform(gnUniform uniform, gnBufferUniformInfo bufferInfo) {
uniform->pool->device->deviceFunctions->_gnUpdateBufferUniform(uniform, &bufferInfo); uniform->pool->device->deviceFunctions->_gnUpdateBufferUniform(uniform, &bufferInfo);
} }
void gnUpdateImageUniform(gnUniform uniform, gnImageUniformInfo imageInfo) {
uniform->pool->device->deviceFunctions->_gnUpdateImageUniform(uniform, &imageInfo);
}

View File

@@ -11,6 +11,11 @@ typedef struct gnBufferUniformInfo {
size_t size; size_t size;
} gnBufferUniformInfo; } gnBufferUniformInfo;
typedef struct gnImageUniformInfo {
uint32_t binding;
gnTexture texture;
} gnImageUniformInfo;
#ifdef GN_REVEAL_IMPL #ifdef GN_REVEAL_IMPL
struct gnUniform_t { struct gnUniform_t {
struct gnPlatformUniform_t* uniform; struct gnPlatformUniform_t* uniform;
@@ -20,3 +25,4 @@ struct gnUniform_t {
GN_ARRAY_LIST(gnUniform) GN_ARRAY_LIST(gnUniform)
void gnUpdateBufferUniform(gnUniform uniform, gnBufferUniformInfo bufferInfo); void gnUpdateBufferUniform(gnUniform uniform, gnBufferUniformInfo bufferInfo);
void gnUpdateImageUniform(gnUniform uniform, gnImageUniformInfo imageInfo);

View File

@@ -4,6 +4,7 @@
typedef enum gnUniformType { typedef enum gnUniformType {
GN_UNIFORM_BUFFER_DESCRIPTOR, GN_UNIFORM_BUFFER_DESCRIPTOR,
GN_IMAGE_DESCRIPTOR,
GN_UNIFORM_TYPE_MAX GN_UNIFORM_TYPE_MAX
} gnUniformType; } gnUniformType;