diff options
Diffstat (limited to 'src/texture.hpp')
| -rw-r--r-- | src/texture.hpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/texture.hpp b/src/texture.hpp new file mode 100644 index 0000000..819f1c2 --- /dev/null +++ b/src/texture.hpp @@ -0,0 +1,81 @@ +#pragma once + +#include "vke.h" +#include "resource.hpp" + +namespace vks +{ + struct Texture : public Resource { + VkImage image = VK_NULL_HANDLE; + VkImageView view = VK_NULL_HANDLE; + VkSampler sampler = VK_NULL_HANDLE; + + VkImageCreateInfo infos = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO}; + VkImageLayout imageLayout; + VkDescriptorImageInfo descriptor; + + void create (ptrVkDev _device, + VkImageType imageType, VkFormat format, uint32_t width, uint32_t height, + VkImageUsageFlags usage, VkMemoryPropertyFlags memProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL, + uint32_t mipLevels = 1, uint32_t arrayLayers = 1, + VkImageCreateFlags flags = 0, + VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT, + VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + VkSharingMode sharingMode = VK_SHARING_MODE_EXCLUSIVE); + Texture (); + Texture (ptrVkDev _device, VkFormat _format, VkImage importedImg = VK_NULL_HANDLE, + uint32_t _width = 0, uint32_t height = 0, VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT, + uint32_t mipLevels = 1, uint32_t arrayLayers = 1); + Texture (ptrVkDev _device, + VkImageType imageType, VkFormat format, uint32_t width, uint32_t height, + VkImageUsageFlags usage, VkMemoryPropertyFlags memProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL, + uint32_t mipLevels = 1, uint32_t arrayLayers = 1, + VkImageCreateFlags flags = 0, + VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT, + VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + VkSharingMode sharingMode = VK_SHARING_MODE_EXCLUSIVE); + Texture (ptrVkDev _device, VkQueue copyQueue, VkImageType imageType, VkFormat format, + std::vector<Texture> texArray, uint32_t width, uint32_t height, + VkImageUsageFlags _usage = VK_IMAGE_USAGE_SAMPLED_BIT); + + /** @brief Update image descriptor from current sampler, view and image layout */ + void updateDescriptor(); + + virtual VkWriteDescriptorSet getWriteDescriptorSet (VkDescriptorSet ds, uint32_t binding, VkDescriptorType descriptorType); + + void destroy(); + void setImageLayout( + VkCommandBuffer cmdbuffer, + VkImageLayout oldImageLayout, + VkImageLayout newImageLayout, + VkImageSubresourceRange subresourceRange, + VkPipelineStageFlags srcStageMask, + VkPipelineStageFlags dstStageMask); + + // Fixed sub resource on first mip level and layer + void setImageLayout( + VkCommandBuffer cmdbuffer, + VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, + VkImageLayout newImageLayout, + VkPipelineStageFlags srcStageMask, + VkPipelineStageFlags dstStageMask); + + void copyTo (VkQueue copyQueue, unsigned char* buffer, VkDeviceSize bufferSize); + void createView (VkImageViewType viewType, VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + uint32_t levelCount = 1, uint32_t layerCount = 1, VkComponentMapping components = + {VK_COMPONENT_SWIZZLE_R,VK_COMPONENT_SWIZZLE_G,VK_COMPONENT_SWIZZLE_B,VK_COMPONENT_SWIZZLE_A }); + + void createSampler (VkFilter filter = VK_FILTER_NEAREST, VkSamplerAddressMode addressMode = VK_SAMPLER_ADDRESS_MODE_REPEAT, + VkSamplerMipmapMode mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST, + VkBorderColor borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, + VkCompareOp compareOp = VK_COMPARE_OP_NEVER); + void buildMipmaps (VkQueue copyQueue, VkCommandBuffer _blitCmd = VK_NULL_HANDLE); + void loadStbLinearNoSampling (std::string filename, + ptrVkDev device, + VkImageUsageFlags imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT, + bool flipY = true); + }; +} |