yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
3.3 KiB104 linesraw
1// cpu-shader-object.h
2#pragma once
3#include "cpu-base.h"
4#include "cpu-shader-object-layout.h"
5
6namespace gfx
7{
8using namespace Slang;
9
10namespace cpu
11{
12
13class CPUShaderObjectData
14{
15public:
16    Slang::List<char> m_ordinaryData;
17    // Any "ordinary" / uniform data for this object
18    Slang::RefPtr<BufferResourceImpl> m_bufferResource;
19    Slang::RefPtr<BufferResourceViewImpl> m_bufferView;
20
21    Index getCount();
22    void setCount(Index count);
23    char* getBuffer();
24
25    ~CPUShaderObjectData();
26
27    /// Returns a StructuredBuffer resource view for GPU access into the buffer content.
28    /// Creates a StructuredBuffer resource if it has not been created.
29    ResourceViewBase* getResourceView(
30        RendererBase* device,
31        slang::TypeLayoutReflection* elementLayout,
32        slang::BindingType bindingType);
33};
34
35class ShaderObjectImpl
36    : public ShaderObjectBaseImpl<ShaderObjectImpl, ShaderObjectLayoutImpl, CPUShaderObjectData>
37{
38    typedef ShaderObjectBaseImpl<ShaderObjectImpl, ShaderObjectLayoutImpl, CPUShaderObjectData>
39        Super;
40
41public:
42    List<RefPtr<ResourceViewImpl>> m_resources;
43
44    virtual SLANG_NO_THROW Result SLANG_MCALL
45    init(IDevice* device, ShaderObjectLayoutImpl* typeLayout);
46
47    virtual SLANG_NO_THROW GfxCount SLANG_MCALL getEntryPointCount() override;
48    virtual SLANG_NO_THROW Result SLANG_MCALL
49    getEntryPoint(GfxIndex index, IShaderObject** outEntryPoint) override;
50
51    virtual SLANG_NO_THROW const void* SLANG_MCALL getRawData() override;
52
53    virtual SLANG_NO_THROW size_t SLANG_MCALL getSize() override;
54
55    virtual SLANG_NO_THROW Result SLANG_MCALL
56    setData(ShaderOffset const& offset, void const* data, size_t size) override;
57    virtual SLANG_NO_THROW Result SLANG_MCALL
58    setResource(ShaderOffset const& offset, IResourceView* inView) override;
59    virtual SLANG_NO_THROW Result SLANG_MCALL
60    setObject(ShaderOffset const& offset, IShaderObject* object) override;
61    virtual SLANG_NO_THROW Result SLANG_MCALL
62    setSampler(ShaderOffset const& offset, ISamplerState* sampler) override;
63    virtual SLANG_NO_THROW Result SLANG_MCALL setCombinedTextureSampler(
64        ShaderOffset const& offset,
65        IResourceView* textureView,
66        ISamplerState* sampler) override;
67
68    char* getDataBuffer();
69};
70
71class MutableShaderObjectImpl
72    : public MutableShaderObject<MutableShaderObjectImpl, ShaderObjectLayoutImpl>
73{
74};
75
76class EntryPointShaderObjectImpl : public ShaderObjectImpl
77{
78public:
79    EntryPointLayoutImpl* getLayout();
80};
81
82class RootShaderObjectImpl : public ShaderObjectImpl
83{
84public:
85    virtual SLANG_NO_THROW uint32_t SLANG_MCALL addRef() override;
86    virtual SLANG_NO_THROW uint32_t SLANG_MCALL release() override;
87
88    // An overload for the `init` virtual function, with a more specific type
89    Result init(IDevice* device, RootShaderObjectLayoutImpl* programLayout);
90    using ShaderObjectImpl::init;
91
92    RootShaderObjectLayoutImpl* getLayout();
93
94    EntryPointShaderObjectImpl* getEntryPoint(Index index);
95    List<RefPtr<EntryPointShaderObjectImpl>> m_entryPoints;
96
97    virtual SLANG_NO_THROW GfxCount SLANG_MCALL getEntryPointCount() override;
98    virtual SLANG_NO_THROW Result SLANG_MCALL
99    getEntryPoint(GfxIndex index, IShaderObject** outEntryPoint) override;
100    virtual Result collectSpecializationArgs(ExtendedShaderObjectTypeList& args) override;
101};
102
103} // namespace cpu
104} // namespace gfx