Overview

GPULang is designed from the ground up to make shader development more efficient and maintainable. This guide covers integration patterns, performance optimization, and best practices for using GPULang in real-time rendering applications.

Vulkan integration

struct Program
{
    char* memory;
    GPULang::Loader loader;
    GPULang::VulkanPipelineInfo pipelineInfo;
};

//------------------------------------------------------------------------------
/**
*/
Program
LoadShader(char* fileBuffer, size_t fileBufferSize, VkDevice device, std::string shader)
{
    GPULang::Loader loader;
    loader.Load(fileBuffer, fileBufferSize);

    auto prog = loader.Get("TestProgram");

    GPULang::VulkanPipelineInfo vulkanPipeline = GPULang::SetupVulkan(
        device
        , prog
        , loader.variables.data()
        , loader.variables.size()
        , GPULang::VulkanFunctions{ .vkCreateShaderModule = vkCreateShaderModule, .vkCreatePipelineLayout = vkCreatePipelineLayout, .vkCreateDescriptorSetLayout = vkCreateDescriptorSetLayout }
    );
    Program ret;

    ret.pipelineInfo = vulkanPipeline;
    ret.memory = buf;
    ret.loader = loader;
    return ret;
}

//------------------------------------------------------------------------------
/**
*/
void main()
{
    ... // Setup vulkan
    Program computeProgram = LoadShader(device, "mycomputeshader.gplb");
    VkComputePipelineCreateInfo cmpPsoInfo = GPULang::GetComputePipeline(computeProgram.pipelineInfo);
    VkPipeline computePipeline;
    VERIFY(vkCreateComputePipelines(device, VK_NULL_HANDLE, 1, &cmpPsoInfo, nullptr, &computePipeline));
}