module gfx.vulkan.pipeline;

package:

import gfx.bindings.vulkan;

import gfx.core.rc;
import gfx.graal.pipeline;
import gfx.vulkan.device;

class VulkanShaderModule : VulkanDevObj!(VkShaderModule, "destroyShaderModule"), ShaderModule
{
    mixin(atomicRcCode);
    this(VkShaderModule vk, VulkanDevice dev, string entryPoint)
    {
        super(vk, dev);
        _entryPoint = entryPoint;
    }

    override @property string entryPoint() {
        return _entryPoint;
    }

    private string _entryPoint;
}

class VulkanPipelineLayout : VulkanDevObj!(VkPipelineLayout, "destroyPipelineLayout"), PipelineLayout
{
    mixin(atomicRcCode);
    this(VkPipelineLayout vk, VulkanDevice dev)
    {
        super(vk, dev);
    }
}

class VulkanPipeline : VulkanDevObj!(VkPipeline, "destroyPipeline"), Pipeline
{
    mixin(atomicRcCode);
    this(VkPipeline vk, VulkanDevice dev, PipelineLayout pl)
    {
        super(vk, dev);
        this.pl = pl;
    }

    override void dispose() {
        pl.unload();
        super.dispose();
    }

    private Rc!PipelineLayout pl;
}