diff --git a/renderdoc/data/glsl/shaderdebug_sample.vert b/renderdoc/data/glsl/shaderdebug_sample.vert index 4a2bef5fc..6ad67cfa1 100644 --- a/renderdoc/data/glsl/shaderdebug_sample.vert +++ b/renderdoc/data/glsl/shaderdebug_sample.vert @@ -22,11 +22,11 @@ * THE SOFTWARE. ******************************************************************************/ -layout(location = 0) out vec3 uvw; +layout(location = 0) out vec4 uvwa; layout(push_constant) uniform PushData { - vec4 uvw; + vec4 uvwa; vec4 ddx; vec4 ddy; } @@ -38,9 +38,9 @@ void main(void) vec4(-0.75, 1.25, 0.5, 1.0)); gl_Position = verts[gl_VertexIndex]; - uvw = push.uvw.xyz; + uvwa = push.uvwa; if(gl_VertexIndex == 1) - uvw += push.ddx.xyz; + uvwa.xyz += push.ddx.xyz; else if(gl_VertexIndex == 2) - uvw += push.ddy.xyz; + uvwa.xyz += push.ddy.xyz; } diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index c29e7a515..2d55d59f2 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -2761,13 +2761,22 @@ void ShaderDebugData::Init(WrappedVulkan *driver, VkDescriptorPool descriptorPoo CREATE_OBJECT( DescSetLayout, { + // ShaderDebugBind::Tex1D {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, + // ShaderDebugBind::Tex2D {2, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, + // ShaderDebugBind::Tex3D {3, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, + // ShaderDebugBind::Tex2DMS {4, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, - {5, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, - {6, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, - {7, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, + // ShaderDebugBind::TexCube + {5, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, + // ShaderDebugBind::Buffer + {6, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, + // ShaderDebugBind::Sampler + {7, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, + // ShaderDebugBind::Constants + {8, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL}, }); CREATE_OBJECT(PipeLayout, DescSetLayout, sizeof(Vec4f) * 3 + sizeof(uint32_t)); diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 9fd286e73..477d0bebf 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -77,12 +77,13 @@ enum class ShaderDebugBind { Tex1D = 1, First = Tex1D, - Tex2D, - Tex3D, - Tex2DMS, - Buffer, - Sampler, - Constants, + Tex2D = 2, + Tex3D = 3, + Tex2DMS = 4, + TexCube = 5, + Buffer = 6, + Sampler = 7, + Constants = 8, Count, }; @@ -128,7 +129,7 @@ struct ShaderUniformParameters { Vec3i texel_uvw; int texel_lod; - Vec3f uvw; + Vec4f uvwa; Vec3f ddx; Vec3f ddy; Vec3i offset; @@ -530,70 +531,64 @@ public: const VulkanCreationInfo::ImageView &viewProps = m_Creation.m_ImageView[GetResID(view)]; const VulkanCreationInfo::Image &imageProps = m_Creation.m_Image[viewProps.image]; - VkImageType imageType = imageProps.type; - uint32_t samples = (uint32_t)imageProps.samples; VkDevice dev = m_pDriver->GetDev(); // how many co-ordinates should there be int coords = 0, gradCoords = 0; - switch(viewProps.viewType) - { - case VK_IMAGE_VIEW_TYPE_1D: - coords = 1; - gradCoords = 1; - break; - case VK_IMAGE_VIEW_TYPE_2D: - coords = 2; - gradCoords = 2; - break; - case VK_IMAGE_VIEW_TYPE_3D: - coords = 3; - gradCoords = 3; - break; - case VK_IMAGE_VIEW_TYPE_CUBE: - coords = 3; - gradCoords = 3; - break; - case VK_IMAGE_VIEW_TYPE_1D_ARRAY: - coords = 2; - gradCoords = 1; - break; - case VK_IMAGE_VIEW_TYPE_2D_ARRAY: - coords = 3; - gradCoords = 2; - break; - case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: - coords = 4; - gradCoords = 3; - break; - case VK_IMAGE_VIEW_TYPE_RANGE_SIZE: - case VK_IMAGE_VIEW_TYPE_MAX_ENUM: - RDCERR("Invalid image view type %s", ToStr(viewProps.viewType).c_str()); - return false; - } - - switch(imageType) - { - case VK_IMAGE_TYPE_1D: constParams.dim = ShaderDebugBind::Tex1D; break; - case VK_IMAGE_TYPE_2D: - constParams.dim = ShaderDebugBind::Tex2D; - if(samples > 1) - constParams.dim = ShaderDebugBind::Tex2DMS; - break; - case VK_IMAGE_TYPE_3D: constParams.dim = ShaderDebugBind::Tex3D; break; - default: - { - RDCERR("Unsupported image type %s", ToStr(imageType).c_str()); - return false; - } - } - if(buffer) { constParams.dim = ShaderDebugBind::Buffer; coords = gradCoords = 1; } + else + { + switch(viewProps.viewType) + { + case VK_IMAGE_VIEW_TYPE_1D: + coords = 1; + gradCoords = 1; + constParams.dim = ShaderDebugBind::Tex1D; + break; + case VK_IMAGE_VIEW_TYPE_2D: + coords = 2; + gradCoords = 2; + constParams.dim = ShaderDebugBind::Tex2D; + break; + case VK_IMAGE_VIEW_TYPE_3D: + coords = 3; + gradCoords = 3; + constParams.dim = ShaderDebugBind::Tex3D; + break; + case VK_IMAGE_VIEW_TYPE_CUBE: + coords = 3; + gradCoords = 3; + constParams.dim = ShaderDebugBind::TexCube; + break; + case VK_IMAGE_VIEW_TYPE_1D_ARRAY: + coords = 2; + gradCoords = 1; + constParams.dim = ShaderDebugBind::Tex1D; + break; + case VK_IMAGE_VIEW_TYPE_2D_ARRAY: + coords = 3; + gradCoords = 2; + constParams.dim = ShaderDebugBind::Tex2D; + break; + case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: + coords = 4; + gradCoords = 3; + constParams.dim = ShaderDebugBind::TexCube; + break; + case VK_IMAGE_VIEW_TYPE_RANGE_SIZE: + case VK_IMAGE_VIEW_TYPE_MAX_ENUM: + RDCERR("Invalid image view type %s", ToStr(viewProps.viewType).c_str()); + return false; + } + + if(imageProps.samples > 1) + constParams.dim = ShaderDebugBind::Tex2DMS; + } // handle query opcodes now switch(opcode) @@ -665,6 +660,8 @@ public: viewInfo.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY; else if(viewInfo.viewType == VK_IMAGE_VIEW_TYPE_2D) viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; + else if(viewInfo.viewType == VK_IMAGE_VIEW_TYPE_CUBE) + viewInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; viewInfo.components = viewProps.componentMapping; viewInfo.subresourceRange = viewProps.range; @@ -825,11 +822,13 @@ public: case rdcspv::Op::ImageGather: case rdcspv::Op::ImageDrefGather: { - uniformParams.uvw.x = uv.value.f.x; + uniformParams.uvwa.x = uv.value.f.x; if(coords >= 2) - uniformParams.uvw.y = uv.value.f.y; + uniformParams.uvwa.y = uv.value.f.y; if(coords >= 3) - uniformParams.uvw.z = uv.value.f.z; + uniformParams.uvwa.z = uv.value.f.z; + if(coords >= 4) + uniformParams.uvwa.z = uv.value.f.w; if(useCompare) uniformParams.compare = compare.value.f.x; @@ -886,20 +885,26 @@ public: case rdcspv::Op::ImageSampleProjDrefExplicitLod: case rdcspv::Op::ImageSampleProjDrefImplicitLod: { - uniformParams.uvw.x = uv.value.f.x; + uniformParams.uvwa.x = uv.value.f.x; if(coords >= 2) - uniformParams.uvw.y = uv.value.f.y; + uniformParams.uvwa.y = uv.value.f.y; if(coords >= 3) - uniformParams.uvw.z = uv.value.f.z; + uniformParams.uvwa.z = uv.value.f.z; + if(coords >= 4) + uniformParams.uvwa.z = uv.value.f.w; if(proj) { + // coords shouldn't be 4 because that's only valid for cube arrays which can't be + // projected + RDCASSERT(coords < 4); + // do the divide ourselves rather than severely complicating the sample shader (as proj // variants need non-arrayed textures) float q = uv.value.fv[coords]; - uniformParams.uvw.x /= q; - uniformParams.uvw.y /= q; - uniformParams.uvw.z /= q; + uniformParams.uvwa.x /= q; + uniformParams.uvwa.y /= q; + uniformParams.uvwa.z /= q; } if(operands.flags & rdcspv::ImageOperands::MinLod) @@ -1065,7 +1070,7 @@ public: // push uvw/ddx/ddy for the vertex shader ObjDisp(cmd)->CmdPushConstants(Unwrap(cmd), Unwrap(m_DebugData.PipeLayout), VK_SHADER_STAGE_ALL, - sizeof(Vec4f) * 0, sizeof(Vec3f), &uniformParams.uvw); + sizeof(Vec4f) * 0, sizeof(Vec4f), &uniformParams.uvwa); ObjDisp(cmd)->CmdPushConstants(Unwrap(cmd), Unwrap(m_DebugData.PipeLayout), VK_SHADER_STAGE_ALL, sizeof(Vec4f) * 1, sizeof(Vec3f), &uniformParams.ddx); ObjDisp(cmd)->CmdPushConstants(Unwrap(cmd), Unwrap(m_DebugData.PipeLayout), VK_SHADER_STAGE_ALL, @@ -1863,9 +1868,10 @@ private: DECL_UNIFORM(int32_t, texel_v, texel_uvw.y); DECL_UNIFORM(int32_t, texel_w, texel_uvw.z); DECL_UNIFORM(int32_t, texel_lod, texel_lod); - DECL_UNIFORM(float, u, uvw.x); - DECL_UNIFORM(float, v, uvw.y); - DECL_UNIFORM(float, w, uvw.z); + DECL_UNIFORM(float, u, uvwa.x); + DECL_UNIFORM(float, v, uvwa.y); + DECL_UNIFORM(float, w, uvwa.z); + DECL_UNIFORM(float, cube_a, uvwa.w); DECL_UNIFORM(float, dudx, ddx.x); DECL_UNIFORM(float, dvdx, ddx.y); DECL_UNIFORM(float, dwdx, ddx.z); @@ -1924,6 +1930,7 @@ private: editor.DeclareType(rdcspv::Image(base, rdcspv::Dim::_2D, 0, 1, 0, 1, unk)), editor.DeclareType(rdcspv::Image(base, rdcspv::Dim::_3D, 0, 0, 0, 1, unk)), editor.DeclareType(rdcspv::Image(base, rdcspv::Dim::_2D, 0, 1, 1, 1, unk)), + editor.DeclareType(rdcspv::Image(base, rdcspv::Dim::Cube, 0, 1, 0, 1, unk)), editor.DeclareType(rdcspv::Image(base, rdcspv::Dim::Buffer, 0, 0, 0, 1, unk)), editor.DeclareType(rdcspv::Sampler()), cbufferStructID, @@ -1936,6 +1943,7 @@ private: editor.DeclareType(rdcspv::SampledImage(texSampTypes[3])), editor.DeclareType(rdcspv::SampledImage(texSampTypes[4])), editor.DeclareType(rdcspv::SampledImage(texSampTypes[5])), + editor.DeclareType(rdcspv::SampledImage(texSampTypes[6])), rdcspv::Id(), rdcspv::Id(), }; @@ -1961,22 +1969,23 @@ private: editor.SetName(bindVars[(size_t)ShaderDebugBind::Tex2D], "Tex2D"); editor.SetName(bindVars[(size_t)ShaderDebugBind::Tex3D], "Tex3D"); editor.SetName(bindVars[(size_t)ShaderDebugBind::Tex2DMS], "Tex2DMS"); + editor.SetName(bindVars[(size_t)ShaderDebugBind::TexCube], "TexCube"); editor.SetName(bindVars[(size_t)ShaderDebugBind::Buffer], "Buffer"); editor.SetName(bindVars[(size_t)ShaderDebugBind::Sampler], "Sampler"); editor.SetName(bindVars[(size_t)ShaderDebugBind::Constants], "CBuffer"); - rdcspv::Id uvw_ptr = editor.DeclareType(rdcspv::Pointer(v3f32, rdcspv::StorageClass::Input)); - rdcspv::Id input_uvw_var = - editor.AddVariable(rdcspv::OpVariable(uvw_ptr, editor.MakeId(), rdcspv::StorageClass::Input)); + rdcspv::Id uvwa_ptr = editor.DeclareType(rdcspv::Pointer(v4f32, rdcspv::StorageClass::Input)); + rdcspv::Id input_uvwa_var = editor.AddVariable( + rdcspv::OpVariable(uvwa_ptr, editor.MakeId(), rdcspv::StorageClass::Input)); editor.AddDecoration(rdcspv::OpDecorate( - input_uvw_var, rdcspv::DecorationParam(0))); + input_uvwa_var, rdcspv::DecorationParam(0))); - editor.SetName(input_uvw_var, "uvw"); + editor.SetName(input_uvwa_var, "input_uvwa"); // register the entry point editor.AddOperation(editor.Begin(rdcspv::Section::EntryPoints), rdcspv::OpEntryPoint(rdcspv::ExecutionModel::Fragment, entryId, "main", - {input_uvw_var, outVar})); + {input_uvwa_var, outVar})); editor.AddOperation(editor.Begin(rdcspv::Section::ExecutionMode), rdcspv::OpExecutionMode(entryId, rdcspv::ExecutionMode::OriginUpperLeft)); @@ -2007,9 +2016,12 @@ private: rdcspv::Id uv = func.add(rdcspv::OpCompositeConstruct(v2f32, editor.MakeId(), {u, v})); rdcspv::Id uvw = func.add(rdcspv::OpCompositeConstruct(v3f32, editor.MakeId(), {u, v, w})); + rdcspv::Id uvwa = + func.add(rdcspv::OpCompositeConstruct(v4f32, editor.MakeId(), {u, v, w, cube_a})); editor.SetName(uv, "uv"); editor.SetName(uvw, "uvw"); + editor.SetName(uvwa, "uvwa"); rdcspv::Id ddx_uv = func.add(rdcspv::OpCompositeConstruct(v2f32, editor.MakeId(), {dudx, dvdx})); rdcspv::Id ddx_uvw = @@ -2033,7 +2045,9 @@ private: editor.SetName(offset_xy, "offset_xy"); editor.SetName(offset_xyz, "offset_xyz"); - rdcspv::Id input_uvw = func.add(rdcspv::OpLoad(v3f32, editor.MakeId(), input_uvw_var)); + rdcspv::Id input_uvwa = func.add(rdcspv::OpLoad(v4f32, editor.MakeId(), input_uvwa_var)); + rdcspv::Id input_uvw = + func.add(rdcspv::OpVectorShuffle(v3f32, editor.MakeId(), input_uvwa, input_uvwa, {0, 1, 2})); rdcspv::Id input_uv = func.add(rdcspv::OpVectorShuffle(v2f32, editor.MakeId(), input_uvw, input_uvw, {0, 1})); @@ -2056,11 +2070,12 @@ private: rdcspv::Id texel_coord[(uint32_t)ShaderDebugBind::Count] = { rdcspv::Id(), - texel_uv, // 1D - u and array - texel_uvw, // 2D - u,v and array - texel_uvw, // 3D - u,v,w - texel_uvw, // 2DMS - u,v and array - texel_u, // Buffer - u + texel_uv, // 1D - u and array + texel_uvw, // 2D - u,v and array + texel_uvw, // 3D - u,v,w + texel_uvw, // 2DMS - u,v and array + rdcspv::Id(), // Cube + texel_u, // Buffer - u }; // only used for QueryLod, so we can ignore MSAA/Buffer @@ -2070,25 +2085,28 @@ private: input_uvw, // 2D - u,v and array input_uvw, // 3D - u,v,w rdcspv::Id(), // 2DMS + input_uvwa, // Cube - u,v,w and array rdcspv::Id(), // Buffer }; rdcspv::Id coord[(uint32_t)ShaderDebugBind::Count] = { rdcspv::Id(), - uv, // 1D - u and array - uvw, // 2D - u,v and array - uvw, // 3D - u,v,w - uvw, // 2DMS - u,v and array - u, // Buffer - u + uv, // 1D - u and array + uvw, // 2D - u,v and array + uvw, // 3D - u,v,w + uvw, // 2DMS - u,v and array + uvwa, // Cube - u,v,w and array + u, // Buffer - u }; rdcspv::Id offsets[(uint32_t)ShaderDebugBind::Count] = { rdcspv::Id(), - offset_x, // 1D - u - offset_xy, // 2D - u,v - offset_xyz, // 3D - u,v,w - offset_xy, // 2DMS - u,v - offset_x, // Buffer - u + offset_x, // 1D - u + offset_xy, // 2D - u,v + offset_xyz, // 3D - u,v,w + offset_xy, // 2DMS - u,v + rdcspv::Id(), // Cube - not valid + offset_x, // Buffer - u }; rdcspv::Id ddxs[(uint32_t)ShaderDebugBind::Count] = { @@ -2097,6 +2115,7 @@ private: ddx_uv, // 2D - u,v ddx_uvw, // 3D - u,v,w ddx_uv, // 2DMS - u,v + ddx_uvw, // Cube - u,v,w dudx, // Buffer - u }; @@ -2106,6 +2125,7 @@ private: ddy_uv, // 2D - u,v ddy_uvw, // 3D - u,v,w ddy_uv, // 2DMS - u,v + ddy_uvw, // Cube - u,v,w dudy, // Buffer - u }; @@ -2118,6 +2138,8 @@ private: if(i == sampIdx || i == (uint32_t)ShaderDebugBind::Constants) continue; + // can't fetch from cubemaps + if(i != (uint32_t)ShaderDebugBind::TexCube) { rdcspv::Op op = rdcspv::Op::ImageFetch; @@ -2181,7 +2203,7 @@ private: rdcspv::ImageOperandsAndParamDatas imageOperands; - if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended) + if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended && offsets[i] != rdcspv::Id()) imageOperands.setOffset(offsets[i]); cases.add(rdcspv::OpLabel(label)); @@ -2241,7 +2263,7 @@ private: rdcspv::ImageOperandsAndParamDatas imageOperands; - if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended) + if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended && offsets[i] != rdcspv::Id()) imageOperands.setOffset(offsets[i]); cases.add(rdcspv::OpLabel(label)); @@ -2295,7 +2317,7 @@ private: cases.add(rdcspv::OpBranch(breakLabel)); } - // can only gather with 2D textures + // can only gather with 2D/Cube textures if(i == (uint32_t)ShaderDebugBind::Tex1D || i == (uint32_t)ShaderDebugBind::Tex3D) continue; @@ -2326,7 +2348,7 @@ private: cases.add(rdcspv::OpLabel(baseCase)); rdcspv::ImageOperandsAndParamDatas operands = imageOperands; - if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended) + if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended && offsets[i] != rdcspv::Id()) imageOperands.setOffset(offsets[i]); rdcspv::Id combined = cases.add(rdcspv::OpSampledImage( @@ -2372,7 +2394,7 @@ private: } else { - if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended) + if(m_pDriver->GetDeviceFeatures().shaderImageGatherExtended && offsets[i] != rdcspv::Id()) imageOperands.setOffset(offsets[i]); rdcspv::Id combined = cases.add(rdcspv::OpSampledImage( diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index 0791cfc7b..d17677e19 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -150,6 +150,8 @@ layout(set = 0, binding = 8, rgba32f) uniform coherent imageBuffer storeTexBuffe layout(set = 0, binding = 9) uniform sampler shadowSampler; +layout(set = 0, binding = 10) uniform samplerCube cubeSampler; + layout(set = 0, binding = 20) uniform sampler2DArray queryTest; layout(set = 0, binding = 21) uniform sampler2DMSArray queryTestMS; @@ -1246,6 +1248,32 @@ void main() Color = vec4(x, y, z, w); break; } +)EOSHADER" + R"EOSHADER( + case 153: + { + vec3 cubeCoord = vec3(1.0f, -0.3f, 0.9f); + Color = textureLod(cubeSampler, cubeCoord, 0.0f); + break; + } + case 154: + { + vec3 cubeCoord = vec3(-1.0f, -0.3f, 0.9f); + Color = textureLod(cubeSampler, cubeCoord, 0.0f); + break; + } + case 155: + { + vec3 cubeCoord = vec3(-1.0f, 0.3f, 0.9f); + Color = textureLod(cubeSampler, cubeCoord, 0.0f); + break; + } + case 156: + { + vec3 cubeCoord = vec3(-1.0f, 0.3f, -0.9f); + Color = textureLod(cubeSampler, cubeCoord, 0.0f); + break; + } default: break; } } @@ -2835,6 +2863,7 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource {7, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT}, {8, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT}, {9, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT}, + {10, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT}, {20, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT}, {21, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT}, })); @@ -2982,6 +3011,27 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource uploadBuf.upload(rgba8.data.data(), rgba8.data.size() * sizeof(uint32_t)); + std::vector randomData; + randomData.resize(128 * 128 * sizeof(Vec4f)); + + for(size_t i = 0; i < randomData.size(); i++) + randomData[i] = (rand() >> 4) & 0xff; + + AllocatedBuffer randomBuf( + this, vkh::BufferCreateInfo(randomData.size(), VK_BUFFER_USAGE_TRANSFER_SRC_BIT), + VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_CPU_TO_GPU})); + + randomBuf.upload(randomData.data(), randomData.size()); + + AllocatedImage smileycube( + this, vkh::ImageCreateInfo(rgba8.width, rgba8.height, 0, VK_FORMAT_R8G8B8A8_UNORM, + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, 1, + 6, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT), + VmaAllocationCreateInfo({0, VMA_MEMORY_USAGE_GPU_ONLY})); + + VkImageView smileycubeview = createImageView(vkh::ImageViewCreateInfo( + smileycube.image, VK_IMAGE_VIEW_TYPE_CUBE, VK_FORMAT_R8G8B8A8_UNORM)); + { VkCommandBuffer cmd = GetCommandBuffer(); @@ -2992,6 +3042,8 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource { vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, smiley.image), + vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, smileycube.image), vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, queryTest.image), vkh::ImageMemoryBarrier(0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, @@ -3006,12 +3058,23 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource vkCmdCopyBufferToImage(cmd, uploadBuf.buffer, smiley.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); + for(uint32_t i = 0; i < 6; i++) + { + copy.imageSubresource.baseArrayLayer = i; + vkCmdCopyBufferToImage(cmd, randomBuf.buffer, smileycube.image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); + } + vkh::cmdPipelineBarrier( - cmd, { - vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, smiley.image), - }); + cmd, + { + vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, smiley.image), + vkh::ImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, smileycube.image), + }); vkEndCommandBuffer(cmd); @@ -3162,6 +3225,10 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource vkh::WriteDescriptorSet( descset, 9, VK_DESCRIPTOR_TYPE_SAMPLER, {vkh::DescriptorImageInfo(VK_NULL_HANDLE, VK_IMAGE_LAYOUT_UNDEFINED, shadowsampler)}), + vkh::WriteDescriptorSet( + descset, 10, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + {vkh::DescriptorImageInfo(smileycubeview, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + linearsampler)}), vkh::WriteDescriptorSet( descset, 20, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,