Skip to content
/ mvlg Public

c++17 vulkan automatic layout generator based on vulkanhpp, SPIRV-Reflect and my MuCplGen

Notifications You must be signed in to change notification settings

MuGdxy/mvlg

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mu Vulkan Layout Generator(mvlg)

C++17 vulkan automatic layout generator based on vulkanhpp, SPIRV-Reflect and my front-end compile generator MuCplGen.

mvlg can do:

  • Generate Pipeline Layout from SPIRV

  • Generate DescriptorSetLayout from SPIRV

  • Generate Push Constant Layout from SPIRV

  • Provide Push Constant Layout Entry by semantics like OpenGL, but more flexible

    auto entryA = semanticConstants.GetEntry<uint32_t>("PushConstant.a");
    entryA->data = 2;
  • Provide Descriptor Layout Entry by semantics

    //glsl file
    #version 450
    layout(set = 0, binding = 0, std430) buffer StorageBuffer
    {
        int index;
        float data[];
    } block[2];
    //.cpp file
    auto block = semanticDescriptors.GetEntry<mvlg::NoStorage>("block[0]");
    auto count = semanticDescriptors.GetEntry<uint32_t>("block[0].count");
    auto data = semanticDescriptors.GetEntry<std::vector<float>>("block[0].data");
    
    //set up data
    data->data.resize(1024, 0.0f);
    auto arraySize = descriptorBlockData->data.size();
    count->data = arraySize;
    data->SetVariantArraySize(arraySize);
    block->SetVariantArraySize(arraySize);//to get block total size for memory copy
    
    //memory copy
    void* dst = device.mapMemory(storageBufferMemory, 0, block->TotalSize());
    count->WriteMemory(dst);
    block->WriteMemory(dst);
    
    //write descriptor set
    vk::DescriptorBufferInfo bufferInfo(storageBuffer, 0, descriptorBlock->TotalSize());
    auto write =  block->WriteDescriptorSet(descriptorSet, bufferInfo);
    device.updateDescriptorSets(writes, {});

Build

git clone https://github.com/MuGdxy/mvlg.git
cd ./mvlg
git submodule update --init

cmake:

Turn On MVLG_EXAMPLES to build examples.

Turn On MVLG_INCLUDE_VULKAN_HPP to automatically include Vulkan-Hpp. ELSE, include Vulkan-Headers and Vulkan-Hpp manully by yourself.

Quick Look

If we have such a shader.

//file: example.comp
#version 450
layout (local_size_x_id = 0) in;
layout (push_constant, std430) uniform PushConstant
{
    int a;
    float[2][4] fArray;
};
void main()
{
	...
}

in cpp we can do like this:

mvlg::LayoutGenerator layoutGenerator;
vk::PipelineLayout pipelineLayout;
vk::Pipeline pipeline;
mvlg::SemanticConstants semanticConstants;
void CreatePipelineLayout()
{
    auto module = std::make_shared<spv_reflect::ShaderModule>(readFile("example.comp.spv"));
    //Specialization Constants
    mvlg::SpecializationConstants specializationConstants;
    specializationConstants.AddConstant(0,256);//<example.comp>: layout (local_size_x_id = 0) in;
    
    //Layout Generator
	layoutGenerator.Generate(device, { module }, specializationConstants);
	//Get Pipeline Layout
    pipelineLayout = layoutGenerator.pipelineLayout;
    //Set up Semantic Constants(for push constants)
    semanticConstants.Init(module, pipelineLayout);
    
    //Create Pipeline
    vk::ComputePipelineCreateInfo createInfo({},
			layoutGenerator.shaderStageCreateInfos.front(),
			layoutGenerator.pipelineLayout);
	vk::Result result;
	std::tie(result, computePipeline) = device.createComputePipeline(nullptr, createInfo);
    //Destroy Shader Modules
	layoutGenerator.DestroyShaderModules();
}

void PushConstants(vk::CommandBuffer commandBuffer)
{
    //OpenGL-like Query
    auto entryA =
        semanticConstants.GetEntry<uint32_t>("PushConstant.a");
    auto entryFArray =
        semanticConstants.GetEntry<float[4]>("PushConstant.fArray[1]");

    entryA->data = 2;
    
    entryFArray->data[0] = 8.0f;
    entryFArray->data[1] = 8.0f;
    entryFArray->data[2] = 0.0f;

    entryA->PushConstant(commandBuffer);
    entryFArray->PushConstant(commandBuffer);
}

void CleanUp()
{
    layoutGenerator.DestroyDescriptorSetLayouts();
    layoutGenerator.DestroyPipelineLayout();
}

About

c++17 vulkan automatic layout generator based on vulkanhpp, SPIRV-Reflect and my MuCplGen

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy