Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions core/libs/prx/libSceAgcDriver/Execution/src/PresentationPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,13 @@ PresentationPass::PresentationPass(const Graphics::Context& context, std::size_t
context.Function<PFN_vkUpdateDescriptorSets>("vkUpdateDescriptorSets")(context.device, static_cast<std::uint32_t>(tableWrites.size()), tableWrites.data(), 0, nullptr);
const auto createModule = context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule");
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = sizeof(PRESENTATION_PASS_VERT_SPV);
moduleInfo.pCode = PRESENTATION_PASS_VERT_SPV;
const auto presentationPassVertCode = Graphics::CacheKeyedSpirv(context.graphicsPipelineLibrary, PRESENTATION_PASS_VERT_SPV, sizeof(PRESENTATION_PASS_VERT_SPV));
moduleInfo.codeSize = presentationPassVertCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = presentationPassVertCode.data();
Graphics::Check(createModule(context.device, &moduleInfo, nullptr, &vertex), "vkCreateShaderModule presentation vertex");
moduleInfo.codeSize = sizeof(PRESENTATION_PASS_FRAG_SPV);
moduleInfo.pCode = PRESENTATION_PASS_FRAG_SPV;
const auto presentationPassFragCode = Graphics::CacheKeyedSpirv(context.graphicsPipelineLibrary, PRESENTATION_PASS_FRAG_SPV, sizeof(PRESENTATION_PASS_FRAG_SPV));
moduleInfo.codeSize = presentationPassFragCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = presentationPassFragCode.data();
Graphics::Check(createModule(context.device, &moduleInfo, nullptr, &fragment), "vkCreateShaderModule presentation fragment");
} catch (...) {
release();
Expand Down
7 changes: 6 additions & 1 deletion core/libs/prx/libSceAgcDriver/Execution/src/VulkanDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4554,9 +4554,14 @@ std::shared_ptr<ComputePipelineObjects> VulkanDevice::createComputePipeline(cons
objects->destroyModule = state->DeviceFunction<PFN_vkDestroyShaderModule>("vkDestroyShaderModule");
objects->destroyLayout = state->DeviceFunction<PFN_vkDestroyPipelineLayout>("vkDestroyPipelineLayout");
objects->destroyPipeline = state->DeviceFunction<PFN_vkDestroyPipeline>("vkDestroyPipeline");
std::vector<std::uint32_t> keyed;
if (!state->graphicsPipelineLibrary && shader.spirv.size() > 2) {
keyed.assign(shader.spirv.data(), shader.spirv.data() + shader.spirv.size());
keyed[2] ^= 0x8000u;
}
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = shader.spirv.size() * sizeof(std::uint32_t);
moduleInfo.pCode = shader.spirv.data();
moduleInfo.pCode = keyed.empty() ? shader.spirv.data() : keyed.data();
check(state->DeviceFunction<PFN_vkCreateShaderModule>("vkCreateShaderModule")(state->device, &moduleInfo, nullptr, &objects->module), "vkCreateShaderModule");
objects->resourcesLayout = setLayout;
const std::array<VkDescriptorSetLayout, 2> setLayouts{setLayout, shader.workgroupMemoryDwords != 0 ? state->workgroupMemoryLayout : VK_NULL_HANDLE};
Expand Down
6 changes: 6 additions & 0 deletions core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@

namespace AgcDriver::Graphics {

inline std::vector<std::uint32_t> CacheKeyedSpirv(bool graphicsPipelineLibrary, const std::uint32_t* code, std::size_t bytes) {
std::vector<std::uint32_t> keyed(code, code + bytes / sizeof(std::uint32_t));
if (!graphicsPipelineLibrary && keyed.size() > 2) keyed[2] ^= 0x8000u;
return keyed;
}

class TextureDetiler;
class GpuColorTransfer;
class BufferPool;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ GpuColorTransfer::GpuColorTransfer(const Context& context) : context(context) {
layoutInfo.pPushConstantRanges = &push;
Check(context.Function<PFN_vkCreatePipelineLayout>("vkCreatePipelineLayout")(context.device, &layoutInfo, nullptr, &pipelineLayout), "vkCreatePipelineLayout color transfer");
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = sizeof(COLOR_TRANSFER_SPV);
moduleInfo.pCode = COLOR_TRANSFER_SPV;
const auto colorTransferCode = CacheKeyedSpirv(context.graphicsPipelineLibrary, COLOR_TRANSFER_SPV, sizeof(COLOR_TRANSFER_SPV));
moduleInfo.codeSize = colorTransferCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = colorTransferCode.data();
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &moduleInfo, nullptr, &module), "vkCreateShaderModule color transfer");
VkComputePipelineCreateInfo pipelineInfo{VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO};
pipelineInfo.stage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
Expand Down
7 changes: 6 additions & 1 deletion core/libs/prx/libSceAgcDriver/Graphics/src/Pipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,9 +334,14 @@ Pipeline::Pipeline(const Context& context, const State& state, const VertexInput
const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT meshSubgroup{VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT, nullptr, 32u};
for (std::uint32_t i = 0; i < shaders.size(); ++i) {
const auto& shader = *shaders[i].program;
std::vector<std::uint32_t> keyed;
if (!context.graphicsPipelineLibrary && shader.spirv.size() > 2) {
keyed.assign(shader.spirv.data(), shader.spirv.data() + shader.spirv.size());
keyed[2] ^= 0x8000u;
}
VkShaderModuleCreateInfo module{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
module.codeSize = shader.spirv.size() * sizeof(std::uint32_t);
module.pCode = shader.spirv.data();
module.pCode = keyed.empty() ? shader.spirv.data() : keyed.data();
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &module, nullptr, &_modules[i]), "vkCreateShaderModule graphics");
const auto stage = VulkanStage(shaders[i].stage);
stages[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Expand Down
15 changes: 9 additions & 6 deletions core/libs/prx/libSceAgcDriver/Graphics/src/Recorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1996,8 +1996,9 @@ bool Recorder::gpuSampleCounter() {
layoutInfo.pPushConstantRanges = &push;
Check(context.Function<PFN_vkCreatePipelineLayout>("vkCreatePipelineLayout")(context.device, &layoutInfo, nullptr, &sampleLayout), "vkCreatePipelineLayout sample counter");
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = sizeof(SAMPLE_COUNTER_SPV);
moduleInfo.pCode = SAMPLE_COUNTER_SPV;
const auto sampleCounterCode = CacheKeyedSpirv(context.graphicsPipelineLibrary, SAMPLE_COUNTER_SPV, sizeof(SAMPLE_COUNTER_SPV));
moduleInfo.codeSize = sampleCounterCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = sampleCounterCode.data();
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &moduleInfo, nullptr, &module), "vkCreateShaderModule sample counter");
VkComputePipelineCreateInfo pipelineInfo{VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO};
pipelineInfo.stage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
Expand All @@ -2014,8 +2015,9 @@ bool Recorder::gpuSampleCounter() {
const VkPushConstantRange dumpPush{VK_SHADER_STAGE_COMPUTE_BIT, 0, SampleDumpPushBytes};
layoutInfo.pPushConstantRanges = &dumpPush;
Check(context.Function<PFN_vkCreatePipelineLayout>("vkCreatePipelineLayout")(context.device, &layoutInfo, nullptr, &dumpLayout), "vkCreatePipelineLayout sample dumps");
moduleInfo.codeSize = sizeof(SAMPLE_DUMPS_SPV);
moduleInfo.pCode = SAMPLE_DUMPS_SPV;
const auto sampleDumpsCode = CacheKeyedSpirv(context.graphicsPipelineLibrary, SAMPLE_DUMPS_SPV, sizeof(SAMPLE_DUMPS_SPV));
moduleInfo.codeSize = sampleDumpsCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = sampleDumpsCode.data();
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &moduleInfo, nullptr, &module), "vkCreateShaderModule sample dumps");
pipelineInfo.stage.module = module;
pipelineInfo.layout = dumpLayout;
Expand Down Expand Up @@ -2312,8 +2314,9 @@ bool Recorder::RecordMeshArguments(VkCommandBuffer commands, VkDeviceAddress rec
layoutInfo.pPushConstantRanges = &push;
Check(context.Function<PFN_vkCreatePipelineLayout>("vkCreatePipelineLayout")(context.device, &layoutInfo, nullptr, &meshArgumentLayout), "vkCreatePipelineLayout mesh arguments");
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = sizeof(MESH_ARGUMENTS_SPV);
moduleInfo.pCode = MESH_ARGUMENTS_SPV;
const auto meshArgumentsCode = CacheKeyedSpirv(context.graphicsPipelineLibrary, MESH_ARGUMENTS_SPV, sizeof(MESH_ARGUMENTS_SPV));
moduleInfo.codeSize = meshArgumentsCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = meshArgumentsCode.data();
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &moduleInfo, nullptr, &module), "vkCreateShaderModule mesh arguments");
VkComputePipelineCreateInfo pipelineInfo{VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO};
pipelineInfo.stage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
Expand Down
15 changes: 9 additions & 6 deletions core/libs/prx/libSceAgcDriver/Graphics/src/TextureDetiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ TextureDetiler::TextureDetiler(const Context& context) : context(context) {
pipelineLayoutInfo.pPushConstantRanges = &pushRange;
Check(context.Function<PFN_vkCreatePipelineLayout>("vkCreatePipelineLayout")(context.device, &pipelineLayoutInfo, nullptr, &pipelineLayout), "vkCreatePipelineLayout");
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = sizeof(TEXTURE_DETILE_SPV);
moduleInfo.pCode = TEXTURE_DETILE_SPV;
const auto textureDetileCode = CacheKeyedSpirv(context.graphicsPipelineLibrary, TEXTURE_DETILE_SPV, sizeof(TEXTURE_DETILE_SPV));
moduleInfo.codeSize = textureDetileCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = textureDetileCode.data();
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &moduleInfo, nullptr, &module), "vkCreateShaderModule");
bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
Check(context.Function<PFN_vkCreateDescriptorSetLayout>("vkCreateDescriptorSetLayout")(context.device, &layoutInfo, nullptr, &imageDescriptorLayout), "vkCreateDescriptorSetLayout");
Expand Down Expand Up @@ -161,8 +162,9 @@ VkPipeline TextureDetiler::pipeline(TextureTileMode tileMode, std::uint32_t elem
}
if (image && imageModule == VK_NULL_HANDLE) {
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = sizeof(TEXTURE_DETILE_IMAGE_SPV);
moduleInfo.pCode = TEXTURE_DETILE_IMAGE_SPV;
const auto textureDetileImageCode = CacheKeyedSpirv(context.graphicsPipelineLibrary, TEXTURE_DETILE_IMAGE_SPV, sizeof(TEXTURE_DETILE_IMAGE_SPV));
moduleInfo.codeSize = textureDetileImageCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = textureDetileImageCode.data();
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &moduleInfo, nullptr, &imageModule), "vkCreateShaderModule");
}
std::array<VkSpecializationMapEntry, 22> entries{};
Expand Down Expand Up @@ -292,8 +294,9 @@ void TextureDetiler::DispatchCmaskClear(VkCommandBuffer commands, VkBuffer cmask
pipelineLayoutInfo.pPushConstantRanges = &pushRange;
Check(context.Function<PFN_vkCreatePipelineLayout>("vkCreatePipelineLayout")(context.device, &pipelineLayoutInfo, nullptr, &cmaskPipelineLayout), "vkCreatePipelineLayout CMASK clear");
VkShaderModuleCreateInfo moduleInfo{VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO};
moduleInfo.codeSize = sizeof(CMASK_CLEAR_SPV);
moduleInfo.pCode = CMASK_CLEAR_SPV;
const auto cmaskClearCode = CacheKeyedSpirv(context.graphicsPipelineLibrary, CMASK_CLEAR_SPV, sizeof(CMASK_CLEAR_SPV));
moduleInfo.codeSize = cmaskClearCode.size() * sizeof(std::uint32_t);
moduleInfo.pCode = cmaskClearCode.data();
VkShaderModule cmaskModule = VK_NULL_HANDLE;
Check(context.Function<PFN_vkCreateShaderModule>("vkCreateShaderModule")(context.device, &moduleInfo, nullptr, &cmaskModule), "vkCreateShaderModule CMASK clear");
VkComputePipelineCreateInfo pipelineInfo{VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO};
Expand Down
Loading