From 466c7b030e7b1ed7c36fb808e7dff844b9b948fb Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 10 Apr 2026 23:21:30 -0500 Subject: [PATCH] load mipmaps from .dds, enable anisotropy --- Makefile | 3 +- checker.dds | Bin 0 -> 5592552 bytes checker.idx | Bin 0 -> 9600 bytes checker.vtx | Bin 0 -> 76800 bytes filenames.txt | 6 +- include/dds.h | 258 +++++++++++++++++++++++++++++++++++++++++ include/dds_validate.h | 11 ++ shader/triangle.hlsl | 4 +- src/dds_validate.cpp | 91 +++++++++++++++ src/main.cpp | 83 ++++++++----- 10 files changed, 422 insertions(+), 34 deletions(-) create mode 100644 checker.dds create mode 100644 checker.idx create mode 100644 checker.vtx create mode 100644 include/dds.h create mode 100644 include/dds_validate.h create mode 100644 src/dds_validate.cpp diff --git a/Makefile b/Makefile index 2d1f575..9183de2 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,8 @@ OBJS = \ src/main.o \ src/volk/volk.o \ src/file.o \ - src/pack.o + src/pack.o \ + src/dds_validate.o ifeq ($(UNAME),Darwin) LIBS = \ diff --git a/checker.dds b/checker.dds new file mode 100644 index 0000000000000000000000000000000000000000..694ad568cff23de4578b47a2768a85c2f6026d1e GIT binary patch literal 5592552 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 PeEzS${`&j>`ak~#1F$Z3 literal 0 HcmV?d00001 diff --git a/checker.idx b/checker.idx new file mode 100644 index 0000000000000000000000000000000000000000..a4762df10b018d9491c3e1b6adb50bf0b34a2087 GIT binary patch literal 9600 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 +#include + +#include "new.h" +#include "dds_validate.h" + +static inline uint32_t max(uint32_t a, uint32_t b) +{ + return (a > b) ? a : b; +} + +struct dds_size_levels { + uint32_t const size; + uint32_t const levels; +}; + +static inline uint32_t dim(uint32_t d) +{ + return max(1, (d / 4)); +} + +static inline uint32_t mip_size(DXGI_FORMAT dxgiFormat, uint32_t height, uint32_t width) +{ + switch (dxgiFormat) { + case DXGI_FORMAT_BC1_TYPELESS: [[fallthrough]]; + case DXGI_FORMAT_BC1_UNORM: [[fallthrough]]; + case DXGI_FORMAT_BC1_UNORM_SRGB: + return dim(height) * dim(width) * 8; + case DXGI_FORMAT_R8G8B8A8_TYPELESS: [[fallthrough]]; + case DXGI_FORMAT_R8G8B8A8_UNORM: [[fallthrough]]; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: [[fallthrough]]; + case DXGI_FORMAT_R8G8B8A8_UINT: [[fallthrough]]; + case DXGI_FORMAT_R8G8B8A8_SNORM: [[fallthrough]]; + case DXGI_FORMAT_R8G8B8A8_SINT: + return height * width * 4; + default: + assert(false); + } +} + +static inline dds_size_levels dds_mip_total_size(DXGI_FORMAT dxgiFormat, + uint32_t height, + uint32_t width, + uint32_t max_mip_levels, + uint32_t * offsets) +{ + uint32_t mip_total_size = 0; + uint32_t mip_levels = 0; + while (true) { + offsets[mip_levels] = mip_total_size; + mip_levels += 1; + assert(mip_levels <= max_mip_levels); + + uint32_t mip_offset = mip_size(dxgiFormat, height, width); + mip_total_size += mip_offset; + + if (max_mip_levels == 1 || (width == 1 && height == 1)) + break; + + height = max(1, height / 2); + width = max(1, width / 2); + } + + return {mip_total_size, mip_levels}; +} + +DDS_FILE const * dds_validate(void const * data, uint32_t size, uint32_t ** out_offsets, void ** out_data) +{ + DDS_FILE const * const dds = (DDS_FILE const *)data; + assert(dds->dwMagic == DDS_MAGIC); + assert(dds->header.dwSize == 124); + assert(dds->header.ddspf.dwSize == 32); + assert(dds->header.ddspf.dwFlags == DDS_FOURCC); + //assert(dds->header.ddspf.dwFourCC == MAKEFOURCC('D','X','T','1')); + assert(dds->header.ddspf.dwFourCC == MAKEFOURCC('D','X','1','0')); + + uint32_t * offsets = NewM(dds->header.dwMipMapCount); + + uintptr_t image_data = ((uintptr_t)dds) + (sizeof (DDS_FILE)); + dds_size_levels ret = dds_mip_total_size(dds->header10.dxgiFormat, + dds->header.dwHeight, + dds->header.dwWidth, + dds->header.dwMipMapCount, + offsets); + assert(ret.size + (sizeof (DDS_FILE)) == size); + assert(ret.levels == dds->header.dwMipMapCount); + + *out_offsets = offsets; + *out_data = (void *)image_data; + return dds; +} diff --git a/src/main.cpp b/src/main.cpp index feb7c22..bed4345 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,7 @@ #include "new.h" #include "file.h" +#include "dds_validate.h" template inline static constexpr T min(T a, T b) @@ -216,7 +217,7 @@ float theta = 0; XMMATRIX currentModel() { theta += 0.01; - return XMMatrixTranslation(0, 0, -0.5) * XMMatrixRotationX(theta); + return XMMatrixTranslation(0, 0, 0.0) * XMMatrixRotationX(theta) * XMMatrixRotationZ(XM_PI * 0.5f); } void recreateSwapchain(VkSurfaceFormatKHR surfaceFormat, VkFormat depthFormat, VkPhysicalDeviceMemoryProperties const & memoryProperties, VkSurfaceCapabilitiesKHR const & surfaceCapabilities) @@ -446,6 +447,8 @@ int main() printf(" maxSamplerAllocationCount %u\n", properties.properties.limits.maxSamplerAllocationCount); printf(" nonCoherentAtomSize %lu\n", properties.properties.limits.nonCoherentAtomSize); printf(" minUniformBufferOffsetAlignment %lu\n", properties.properties.limits.minUniformBufferOffsetAlignment); + printf(" maxSamplerLodBias %f\n", properties.properties.limits.maxSamplerLodBias); + printf(" maxSamplerAnisotropy %f\n", properties.properties.limits.maxSamplerAnisotropy); physicalDeviceProperties = properties.properties; } } @@ -586,9 +589,9 @@ int main() { uint32_t vertexSize; - void const * vertexStart = file::open("position_normal_texture.vtx", &vertexSize); + void const * vertexStart = file::open("checker.vtx", &vertexSize); uint32_t indexSize; - void const * indexStart = file::open("index.idx", &indexSize); + void const * indexStart = file::open("checker.idx", &indexSize); vertexBufferSize = vertexSize; indexBufferSize = indexSize; @@ -709,14 +712,25 @@ int main() // texture ////////////////////////////////////////////////////////////////////// + uint32_t checkerSize; + void const * checkerStart = file::open("checker.dds", &checkerSize); + void * checkerData; + uint32_t * mipOffsets; + DDS_FILE const * ddsFile = dds_validate(checkerStart, checkerSize, &mipOffsets, &checkerData); + uint32_t checkerDataSize = checkerSize - (sizeof (DDS_FILE)); + VkFormat textureFormat{ VK_FORMAT_B8G8R8A8_SRGB }; VkImageCreateInfo textureImageCreateInfo{ .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .imageType = VK_IMAGE_TYPE_2D, .format = textureFormat, - .extent = {.width = 858, .height = 858, .depth = 1 }, - .mipLevels = 1, + .extent = { + .width = ddsFile->header.dwWidth, + .height = ddsFile->header.dwHeight, + .depth = 1 + }, + .mipLevels = ddsFile->header.dwMipMapCount, .arrayLayers = 1, .samples = VK_SAMPLE_COUNT_1_BIT, .tiling = VK_IMAGE_TILING_OPTIMAL, @@ -748,7 +762,7 @@ int main() .format = textureFormat, .subresourceRange{ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .levelCount = 1, + .levelCount = ddsFile->header.dwMipMapCount, .layerCount = 1 } }; @@ -756,13 +770,10 @@ int main() // texture transfer: source buffer - uint32_t spriteSize; - void const * spriteStart = file::open("sprite.data", &spriteSize); - VkBuffer textureSourceBuffer{}; VkBufferCreateInfo textureSourceBufferCreateInfo{ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, - .size = spriteSize, + .size = checkerDataSize, .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT }; VK_CHECK(vkCreateBuffer(device, &textureSourceBufferCreateInfo, nullptr, &textureSourceBuffer)); @@ -783,7 +794,7 @@ int main() void * textureSourceMappedData; VK_CHECK(vkMapMemory(device, textureSourceBufferMemory, 0, textureSourceBufferCreateInfo.size, 0, &textureSourceMappedData)); - memcpy((void *)(((ptrdiff_t)textureSourceMappedData) + 0), spriteStart, spriteSize); + memcpy((void *)(((ptrdiff_t)textureSourceMappedData) + 0), checkerData, checkerDataSize); vkUnmapMemory(device, textureSourceBufferMemory); VkFenceCreateInfo textureFenceCreateInfo{ @@ -818,7 +829,7 @@ int main() .image = textureImage, .subresourceRange = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .levelCount = 1, + .levelCount = ddsFile->header.dwMipMapCount, .layerCount = 1 } }; @@ -828,16 +839,25 @@ int main() .pImageMemoryBarriers = &barrierTextureImage }; vkCmdPipelineBarrier2(textureCommandBuffer, &barrierTextureImageDependencyInfo); - VkBufferImageCopy copyRegion{ - .bufferOffset = 0, - .imageSubresource{ - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = 0, - .layerCount = 1 - }, - .imageExtent{ .width = 858, .height = 858, .depth = 1 }, - }; - vkCmdCopyBufferToImage(textureCommandBuffer, textureSourceBuffer, textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©Region); + VkBufferImageCopy * copyRegions = NewM(ddsFile->header.dwMipMapCount); + for (uint32_t level = 0; level < ddsFile->header.dwMipMapCount; level++) { + copyRegions[level] = { + .bufferOffset = mipOffsets[level], + .imageSubresource{ + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .mipLevel = level, + .layerCount = 1 + }, + .imageExtent{ + .width = max(1u, ddsFile->header.dwWidth >> level), + .height = max(1u, ddsFile->header.dwHeight >> level), + .depth = 1 + }, + }; + } + vkCmdCopyBufferToImage(textureCommandBuffer, textureSourceBuffer, textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, ddsFile->header.dwMipMapCount, copyRegions); + free(mipOffsets); + free(copyRegions); VkImageMemoryBarrier2 barrierTextureRead{ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, @@ -848,7 +868,7 @@ int main() .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, .newLayout = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL, .image = textureImage, - .subresourceRange = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .levelCount = 1, .layerCount = 1 } + .subresourceRange = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .levelCount = ddsFile->header.dwMipMapCount, .layerCount = 1 } }; VkDependencyInfo barrierTextureReadDependencyInfo{ .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, @@ -877,8 +897,11 @@ int main() .magFilter = VK_FILTER_LINEAR, .minFilter = VK_FILTER_LINEAR, .mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR, - .anisotropyEnable = VK_FALSE, - .maxLod = 1, + .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, + .anisotropyEnable = VK_TRUE, + .maxAnisotropy = 16.0f, + .maxLod = (float)ddsFile->header.dwMipMapCount, }; VK_CHECK(vkCreateSampler(device, &samplerCreateInfo, nullptr, &textureSampler)); @@ -1041,14 +1064,14 @@ int main() VkVertexInputBindingDescription vertexBindingDescriptions[1]{ { .binding = 0, - .stride = (3 * (sizeof (float)) * 3), + .stride = ((3 + 3 + 2) * (sizeof (float))), .inputRate = VK_VERTEX_INPUT_RATE_VERTEX } }; VkVertexInputAttributeDescription vertexAttributeDescriptions[3]{ { .location = 0, .binding = 0, .format = VK_FORMAT_R32G32B32_SFLOAT, .offset = 3 * 4 * 0 }, { .location = 1, .binding = 0, .format = VK_FORMAT_R32G32B32_SFLOAT, .offset = 3 * 4 * 1 }, - { .location = 2, .binding = 0, .format = VK_FORMAT_R32G32B32_SFLOAT, .offset = 3 * 4 * 2 }, + { .location = 2, .binding = 0, .format = VK_FORMAT_R32G32_SFLOAT, .offset = 3 * 4 * 2 }, }; VkPipelineVertexInputStateCreateInfo vertexInputState{ .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, @@ -1355,13 +1378,13 @@ int main() vkCmdBindVertexBuffers(commandBuffer, 0, 1, &vertexIndexBuffer, &vertexOffset); VkDeviceSize indexOffset{ vertexBufferSize }; vkCmdBindIndexBuffer(commandBuffer, vertexIndexBuffer, indexOffset, VK_INDEX_TYPE_UINT32); - VkDeviceSize indexCount{ 9216 }; + VkDeviceSize indexCount{ 2400 }; vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[MAIN_PIPELINE]); vkCmdDrawIndexed(commandBuffer, indexCount, 3, 0, 0, 0); - vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[OUTLINE_PIPELINE]); - vkCmdDrawIndexed(commandBuffer, indexCount, 3, 0, 0, 0); + //vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[OUTLINE_PIPELINE]); + //vkCmdDrawIndexed(commandBuffer, indexCount, 3, 0, 0, 0); vkCmdEndRendering(commandBuffer);