diff --git a/util/test/demos/CMakeLists.txt b/util/test/demos/CMakeLists.txt index 67fcfe547..ed16d0418 100644 --- a/util/test/demos/CMakeLists.txt +++ b/util/test/demos/CMakeLists.txt @@ -124,7 +124,6 @@ set(VULKAN_SRC vk/vk_draw_zoo.cpp vk/vk_dynamic_rendering.cpp vk/vk_empty_capture.cpp - vk/vk_ext_buffer_address.cpp vk/vk_custom_resolve.cpp vk/vk_extended_dyn_state.cpp vk/vk_graphics_pipeline.cpp diff --git a/util/test/demos/demos.vcxproj b/util/test/demos/demos.vcxproj index d438e02c8..0c4d61a57 100644 --- a/util/test/demos/demos.vcxproj +++ b/util/test/demos/demos.vcxproj @@ -360,7 +360,6 @@ - diff --git a/util/test/demos/demos.vcxproj.filters b/util/test/demos/demos.vcxproj.filters index 9bf5192ab..6e9688082 100644 --- a/util/test/demos/demos.vcxproj.filters +++ b/util/test/demos/demos.vcxproj.filters @@ -358,9 +358,6 @@ Vulkan\demos - - Vulkan\demos - Vulkan\demos diff --git a/util/test/demos/vk/vk_ext_buffer_address.cpp b/util/test/demos/vk/vk_ext_buffer_address.cpp deleted file mode 100644 index 0728181ef..000000000 --- a/util/test/demos/vk/vk_ext_buffer_address.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/****************************************************************************** - * The MIT License (MIT) - * - * Copyright (c) 2019-2026 Baldur Karlsson - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - ******************************************************************************/ - -#include "vk_test.h" - -// only support on 64-bit, just because it's easier to share CPU & GPU structs if pointer size is -// identical - -#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) || \ - (defined(__riscv) && __riscv_xlen == 64) - -RD_TEST(VK_EXT_Buffer_Address, VulkanGraphicsTest) -{ - static constexpr const char *Description = - "Test capture and replay of VK_EXT_buffer_device_address"; - - // should match definition below in GLSL - struct DrawData - { - DefaultA2V *vert_data; - // no alignment on Vec4f, use scalar block layout - Vec4f tint; - Vec2f offset; - Vec2f scale; - // padding to make the struct size 16 to make aligning the buffer easier. - Vec2f padding; - }; - - std::string common = R"EOSHADER( - -#version 460 core - -#extension GL_EXT_buffer_reference : require -#extension GL_EXT_scalar_block_layout : require - -struct v2f -{ - vec4 pos; - vec4 col; - vec4 uv; -}; - -struct DefaultA2V { - vec3 pos; - vec4 col; - vec2 uv; -}; - -layout(buffer_reference, scalar, buffer_reference_align = 16) buffer TriangleData { - DefaultA2V verts[3]; -}; - -layout(buffer_reference, scalar, buffer_reference_align = 16) buffer DrawData { - TriangleData tri; - vec4 tint; - vec2 offset; - vec2 scale; - vec2 padding; -}; - -layout(push_constant) uniform PushData { - DrawData data_ptr; -} push; - -)EOSHADER"; - - const std::string vertex = R"EOSHADER( - -layout(location = 0) out v2f vertOut; - -void main() -{ - DrawData draw = push.data_ptr; - DefaultA2V vert = draw.tri.verts[gl_VertexIndex]; - - gl_Position = vertOut.pos = vec4(vert.pos*vec3(draw.scale,1) + vec3(draw.offset, 0), 1); - vertOut.col = vert.col; - vertOut.uv = vec4(vert.uv, 0, 1); -} - -)EOSHADER"; - - const std::string pixel = R"EOSHADER( - -layout(location = 0) in v2f vertIn; - -layout(location = 0, index = 0) out vec4 Color; - -void main() -{ - DrawData draw = push.data_ptr; - - Color = vertIn.col * draw.tint; -} - -)EOSHADER"; - - void Prepare(int argc, char **argv) - { - devExts.push_back(VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); - devExts.push_back(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); - - VulkanGraphicsTest::Prepare(argc, argv); - - if(!Avail.empty()) - return; - - static VkPhysicalDeviceBufferDeviceAddressFeaturesEXT bufaddrFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, - }; - - getPhysFeatures2(&bufaddrFeatures); - - if(!bufaddrFeatures.bufferDeviceAddress) - Avail = "Buffer device address feature 'bufferDeviceAddress' not available"; - - devInfoNext = &bufaddrFeatures; - } - - int main() - { - // initialise, create window, create context, etc - if(!Init()) - return 3; - - VkPipelineLayout layout = createPipelineLayout( - vkh::PipelineLayoutCreateInfo({}, {vkh::PushConstantRange(VK_SHADER_STAGE_ALL, 0, 8)})); - - vkh::GraphicsPipelineCreateInfo pipeCreateInfo; - - pipeCreateInfo.layout = layout; - pipeCreateInfo.renderPass = mainWindow->rp; - - pipeCreateInfo.stages = { - CompileShaderModule(common + vertex, ShaderLang::glsl, ShaderStage::vert, "main"), - CompileShaderModule(common + pixel, ShaderLang::glsl, ShaderStage::frag, "main"), - }; - - VkPipeline pipe = createGraphicsPipeline(pipeCreateInfo); - - vkh::BufferCreateInfo bufinfo(0x100000, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT); - - AllocatedBuffer databuf(this, bufinfo, VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_CPU_TO_GPU})); - - // north-facing primary colours triangle - const DefaultA2V tri1[3] = { - {Vec3f(-0.5f, -0.5f, 0.0f), Vec4f(1.0f, 0.0f, 0.0f, 1.0f), Vec2f(0.0f, 0.0f)}, - {Vec3f(0.0f, 0.5f, 0.0f), Vec4f(0.0f, 1.0f, 0.0f, 1.0f), Vec2f(0.0f, 1.0f)}, - {Vec3f(0.5f, -0.5f, 0.0f), Vec4f(0.0f, 0.0f, 1.0f, 1.0f), Vec2f(1.0f, 0.0f)}, - }; - - // north-west-facing triangle - const DefaultA2V tri2[3] = { - {Vec3f(-0.5f, 0.5f, 0.0f), Vec4f(1.0f, 0.2f, 1.0f, 1.0f), Vec2f(0.0f, 0.0f)}, - {Vec3f(0.5f, 0.5f, 0.0f), Vec4f(0.7f, 0.85f, 1.0f, 1.0f), Vec2f(0.0f, 1.0f)}, - {Vec3f(-0.5f, -0.5f, 0.0f), Vec4f(1.0f, 1.0f, 0.4f, 1.0f), Vec2f(1.0f, 0.0f)}, - }; - - VkBufferDeviceAddressInfoEXT info = {VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT}; - info.buffer = databuf.buffer; - - VkDeviceAddress baseAddr = vkGetBufferDeviceAddressEXT(device, &info); - byte *gpuptr = (byte *)baseAddr; // not a valid cpu pointer but useful for avoiding casting - - byte *cpuptr = databuf.map(); - - // put triangle data first - memcpy(cpuptr, tri1, sizeof(tri1)); - DefaultA2V *gputri1 = (DefaultA2V *)gpuptr; - cpuptr += sizeof(tri1); - gpuptr += sizeof(tri1); - - // align to 16 bytes - cpuptr = AlignUpPtr(cpuptr, 16); - gpuptr = AlignUpPtr(gpuptr, 16); - - memcpy(cpuptr, tri2, sizeof(tri2)); - DefaultA2V *gputri2 = (DefaultA2V *)gpuptr; - cpuptr += sizeof(tri2); - gpuptr += sizeof(tri2); - - // align to 16 bytes - cpuptr = AlignUpPtr(cpuptr, 16); - gpuptr = AlignUpPtr(gpuptr, 16); - - DrawData *drawscpu = (DrawData *)cpuptr; - DrawData *drawsgpu = (DrawData *)gpuptr; - - drawscpu[0].vert_data = gputri1; - drawscpu[0].offset = Vec2f(-0.5f, 0.0f); - drawscpu[0].scale = Vec2f(0.5f, 0.5f); - drawscpu[0].tint = Vec4f(1.0f, 0.5f, 0.5f, 1.0f); // tint red - - drawscpu[1].vert_data = gputri1; - drawscpu[1].offset = Vec2f(0.0f, 0.0f); - drawscpu[1].scale = Vec2f(0.5f, -0.5f); // flip vertically - drawscpu[1].tint = Vec4f(0.2f, 0.5f, 1.0f, 1.0f); // tint blue - - drawscpu[2].vert_data = gputri2; // use second triangle - drawscpu[2].offset = Vec2f(0.6f, 0.0f); - drawscpu[2].scale = Vec2f(0.5f, 0.5f); - drawscpu[2].tint = Vec4f(1.0f, 1.0f, 1.0f, 1.0f); - - float time = 0.0f; - - while(Running()) - { - VkCommandBuffer cmd = GetCommandBuffer(); - - vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo()); - - VkImage swapimg = - StartUsingBackbuffer(cmd, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL); - - vkCmdClearColorImage(cmd, swapimg, VK_IMAGE_LAYOUT_GENERAL, - vkh::ClearColorValue(0.2f, 0.2f, 0.2f, 1.0f), 1, - vkh::ImageSubresourceRange()); - - vkCmdBeginRenderPass( - cmd, vkh::RenderPassBeginInfo(mainWindow->rp, mainWindow->GetFB(), mainWindow->scissor), - VK_SUBPASS_CONTENTS_INLINE); - - vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipe); - vkCmdSetViewport(cmd, 0, 1, &mainWindow->viewport); - vkCmdSetScissor(cmd, 0, 1, &mainWindow->scissor); - - // look ma, no binds - DrawData *bindptr = drawsgpu; - drawscpu[0].scale.x = (abs(sinf(time)) + 0.1f) * 0.5f; - vkCmdPushConstants(cmd, layout, VK_SHADER_STAGE_ALL, 0, 8, &bindptr); - vkCmdDraw(cmd, 3, 1, 0, 0); - - bindptr++; - drawscpu[1].scale.y = (abs(cosf(time)) + 0.1f) * 0.5f; - vkCmdPushConstants(cmd, layout, VK_SHADER_STAGE_ALL, 0, 8, &bindptr); - vkCmdDraw(cmd, 3, 1, 0, 0); - - bindptr++; - drawscpu[2].tint = Vec4f(cosf(time) * 0.5f + 0.5f, sinf(time) * 0.5f + 0.5f, - cosf(time + 3.14f) * 0.5f + 0.5f, 1.0f); - vkCmdPushConstants(cmd, layout, VK_SHADER_STAGE_ALL, 0, 8, &bindptr); - vkCmdDraw(cmd, 3, 1, 0, 0); - - vkCmdEndRenderPass(cmd); - - FinishUsingBackbuffer(cmd, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL); - - vkEndCommandBuffer(cmd); - - Submit(0, 1, {cmd}); - - Present(); - - time += 0.1f; - } - - databuf.unmap(); - - return 0; - } -}; - -REGISTER_TEST(); - -#endif // if 64-bit