aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/VulkanTexture.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VulkanTexture.hpp')
-rw-r--r--src/VulkanTexture.hpp263
1 files changed, 0 insertions, 263 deletions
diff --git a/src/VulkanTexture.hpp b/src/VulkanTexture.hpp
deleted file mode 100644
index 44eea90..0000000
--- a/src/VulkanTexture.hpp
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
-* Vulkan texture loader
-*
-* Copyright(C) 2016-2017 by Sascha Willems - www.saschawillems.de
-*
-* This code is licensed under the MIT license(MIT) (http://opensource.org/licenses/MIT)
-*/
-
-#pragma once
-
-#include <stdlib.h>
-#include <string>
-#include <fstream>
-#include <vector>
-
-#include "vulkan/vulkan.h"
-#include "macros.h"
-#include "VulkanDevice.hpp"
-#include "texture.hpp"
-
-#include <gli/gli.hpp>
-
-#include "tiny_gltf.h"
-
-#if defined(__ANDROID__)
-#include <android/asset_manager.h>
-#endif
-
-#include "VulkanBuffer.hpp"
-
-namespace vke
-{
- class Texture2D : public Texture {
- public:
- void loadFromFile(
- std::string filename,
- VkFormat format,
- vke::device_t *_device,
- VkQueue copyQueue,
- VkImageUsageFlags imageUsageFlags = VK_IMAGE_USAGE_SAMPLED_BIT,
- VkImageLayout imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
- {
-#if defined(__ANDROID__)
- // Textures are stored inside the apk on Android (compressed)
- // So they need to be loaded via the asset manager
- AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING);
- if (!asset) {
- LOGE("Could not load texture %s", filename.c_str());
- exit(-1);
- }
- size_t size = AAsset_getLength(asset);
- assert(size > 0);
-
- void *textureData = malloc(size);
- AAsset_read(asset, textureData, size);
- AAsset_close(asset);
-
- gli::texture2d tex2D(gli::load((const char*)textureData, size));
-
- free(textureData);
-#else
- gli::texture2d tex2D(gli::load(filename.c_str()));
-#endif
- assert(!tex2D.empty());
-
- create(_device, VK_IMAGE_TYPE_2D, format,
- static_cast<uint32_t>(tex2D[0].extent().x),static_cast<uint32_t>(tex2D[0].extent().y),
- imageUsageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
- VK_IMAGE_TILING_OPTIMAL,static_cast<uint32_t>(tex2D.levels()));
-
- copyTo(copyQueue, (unsigned char*)tex2D.data(), tex2D.size());
-
- createView(VK_IMAGE_VIEW_TYPE_2D);
- createSampler(VK_FILTER_LINEAR,VK_SAMPLER_ADDRESS_MODE_REPEAT,VK_SAMPLER_MIPMAP_MODE_LINEAR);
-
- updateDescriptor();
- }
- };
-
- class TextureCubeMap : public Texture {
- public:
- void buildFromImages(const std::vector<std::string>& mapDic, uint32_t textureSize,
- VkFormat _format,
- vke::device_t *_device,
- VkQueue copyQueue,
- VkImageUsageFlags _imageUsageFlags = VK_IMAGE_USAGE_SAMPLED_BIT,
- VkImageLayout _imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL){
-
- create(_device, VK_IMAGE_TYPE_2D, _format,
- textureSize, textureSize,
- _imageUsageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT| VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
- VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_IMAGE_TILING_OPTIMAL,
- (uint32_t)floor(log2(textureSize)) + 1, 6, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT);
-
- imageLayout = _imageLayout;
-
- for (int l = 0; l < mapDic.size(); l++) {
- Texture inTex;
- inTex.loadStbLinearNoSampling(mapDic[l].c_str(), device);
-
- VkCommandBuffer blitFirstMipCmd = device->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
-
- VkImageBlit firstMipBlit{};
- firstMipBlit.srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, l, 1};
- firstMipBlit.srcOffsets[1] = {inTex.infos.extent.width,inTex.infos.extent.height,1};
- firstMipBlit.dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, l, 1};
- firstMipBlit.dstOffsets[1] = {infos.extent.width,infos.extent.height,1};
-
- VkImageSubresourceRange firstMipSubRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, l, 1};
-
- setImageLayout(blitFirstMipCmd,
- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- firstMipSubRange,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
-
- // Blit from source texture
- vkCmdBlitImage(blitFirstMipCmd, inTex.image,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &firstMipBlit, VK_FILTER_CUBIC_IMG);
-
- setImageLayout(blitFirstMipCmd,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- firstMipSubRange,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
-
- device->flushCommandBuffer(blitFirstMipCmd, copyQueue, true);
-
- inTex.destroy();
-
- VkCommandBuffer blitCmd = device->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
-
- // mipmap generation
- // Copy down mips from n-1 to n
- for (int32_t i = 1; i < infos.mipLevels; i++)
- {
- VkImageBlit imageBlit{};
- imageBlit.srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, i-1, l, 1};
- imageBlit.srcOffsets[1] = {infos.extent.width >> (i - 1),infos.extent.height >> (i - 1),1};
- imageBlit.dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, i, l, 1};
- imageBlit.dstOffsets[1] = {infos.extent.width >> i,infos.extent.height >> i, 1};
-
- VkImageSubresourceRange mipSubRange = {VK_IMAGE_ASPECT_COLOR_BIT, i, 1, l, 1};
-
- setImageLayout(blitCmd,
- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- mipSubRange,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
-
- // Blit from previous level
- vkCmdBlitImage(blitCmd,
- image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- 1, &imageBlit, VK_FILTER_LINEAR);
-
- setImageLayout(blitCmd,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- mipSubRange,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
- }
- firstMipSubRange.levelCount = infos.mipLevels;
- setImageLayout(blitCmd,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, imageLayout,
- firstMipSubRange,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
- device->flushCommandBuffer(blitCmd, copyQueue, true);
- }
-
- createView(VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_ASPECT_COLOR_BIT,infos.mipLevels,6);
- createSampler(VK_FILTER_CUBIC_IMG,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,VK_SAMPLER_MIPMAP_MODE_LINEAR);
- //samplerCreateInfo.compareOp = VK_COMPARE_OP_NEVER;
-
- updateDescriptor();
-
- }
- void loadFromFile(
- std::string filename,
- VkFormat format,
- vke::device_t *_device,
- VkImageUsageFlags imageUsageFlags = VK_IMAGE_USAGE_SAMPLED_BIT,
- VkImageLayout _imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
- {
-#if defined(__ANDROID__)
- // Textures are stored inside the apk on Android (compressed)
- // So they need to be loaded via the asset manager
- AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING);
- if (!asset) {
- LOGE("Could not load texture %s", filename.c_str());
- exit(-1);
- }
- size_t size = AAsset_getLength(asset);
- assert(size > 0);
-
- void *textureData = malloc(size);
- AAsset_read(asset, textureData, size);
- AAsset_close(asset);
-
- gli::texture_cube texCube(gli::load((const char*)textureData, size));
-
- free(textureData);
-#else
- gli::texture_cube texCube(gli::load(filename));
-#endif
- assert(!texCube.empty());
-
- create(_device, VK_IMAGE_TYPE_2D, format,
- static_cast<uint32_t>(texCube.extent().x),static_cast<uint32_t>(texCube[0].extent().y),
- imageUsageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
- VK_IMAGE_TILING_OPTIMAL,static_cast<uint32_t>(texCube.levels()), 6, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT);
-
- imageLayout = _imageLayout;
-
- vke::buffer_t stagingBuffer (device,
- VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- texCube.size(), texCube.data());
-
- descriptor.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
-
- VkCommandBuffer copyCmd = device->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
-
- size_t offset = 0;
-
- std::vector<VkBufferImageCopy> bufferCopyRegions;
- for (uint32_t face = 0; face < 6; face++) {
- for (uint32_t level = 0; level < infos.mipLevels; level++) {
- VkBufferImageCopy bufferCopyRegion = {};
- bufferCopyRegion.imageSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, level, face, 1};
- bufferCopyRegion.imageExtent = {(uint32_t)texCube[face][level].extent().x,(uint32_t)texCube[face][level].extent().y,1};
- bufferCopyRegion.bufferOffset = offset;
-
- bufferCopyRegions.push_back(bufferCopyRegion);
- offset += texCube[face][level].size();
- }
- }
- VkImageSubresourceRange subresourceRange = {};
- subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- subresourceRange.baseMipLevel = 0;
- subresourceRange.levelCount = infos.mipLevels;
- subresourceRange.layerCount = 6;
-
- setImageLayout (copyCmd,
- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- subresourceRange,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
-
- vkCmdCopyBufferToImage(copyCmd, stagingBuffer.buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- static_cast<uint32_t>(bufferCopyRegions.size()), bufferCopyRegions.data());
-
- setImageLayout(copyCmd,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, imageLayout,
- subresourceRange,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
-
- device->flushCommandBuffer(copyCmd, device->queue, true);
-
- createView(VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_ASPECT_COLOR_BIT,infos.mipLevels,6);
- createSampler(VK_FILTER_LINEAR,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,VK_SAMPLER_MIPMAP_MODE_LINEAR);
-
- updateDescriptor();
- }
- };
-
-}