summaryrefslogtreecommitdiffstats
path: root/tools/render-test/shader-renderer-util.h
blob: 5bb2d342e7655c745982f7a9d81a7fe4db07e385 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// shader-renderer-util.h
#pragma once

#include "render.h"
#include "shader-input-layout.h"

namespace renderer_test {

using namespace Slang;

struct BindingStateImpl : public Slang::RefObject
{
        /// A register set consists of one or more contiguous indices.
        /// To be valid index >= 0 and size >= 1
    struct RegisterRange
    {
            /// True if contains valid contents
        bool isValid() const { return size > 0; }
            /// True if valid single value
        bool isSingle() const { return size == 1; }
            /// Get as a single index (must be at least one index)
        int getSingleIndex() const { return (size == 1) ? index : -1; }
            /// Return the first index
        int getFirstIndex() const { return (size > 0) ? index : -1; }
            /// True if contains register index
        bool hasRegister(int registerIndex) const { return registerIndex >= index && registerIndex < index + size; }

        static RegisterRange makeInvalid() { return RegisterRange{ -1, 0 }; }
        static RegisterRange makeSingle(int index) { return RegisterRange{ int16_t(index), 1 }; }
        static RegisterRange makeRange(int index, int size) { return RegisterRange{ int16_t(index), uint16_t(size) }; }

        int16_t index;              ///< The base index
        uint16_t size;              ///< The amount of register indices
    };

    void apply(IRenderer* renderer, PipelineType pipelineType);

    struct OutputBinding
    {
        RefPtr<Resource>    resource;
        Slang::UInt         entryIndex;
    };
    List<OutputBinding> outputBindings;

    RefPtr<PipelineLayout>  pipelineLayout;
    RefPtr<DescriptorSet>   descriptorSet;
    int m_numRenderTargets = 1;
};

RefPtr<SamplerState> _createSamplerState(
    IRenderer*               renderer,
    const InputSamplerDesc& srcDesc);

/// Utility class containing functions that construct items on the renderer using the ShaderInputLayout representation
struct ShaderRendererUtil
{
        /// Generate a texture using the InputTextureDesc and construct a TextureResource using the Renderer with the contents
    static Slang::Result generateTextureResource(const InputTextureDesc& inputDesc, int bindFlags, IRenderer* renderer, Slang::RefPtr<TextureResource>& textureOut);

        /// Create texture resource using inputDesc, and texData to describe format, and contents
    static Slang::Result createTextureResource(
        const InputTextureDesc& inputDesc,
        const TextureData& texData,
        int bindFlags,
        IRenderer* renderer,
        Slang::RefPtr<TextureResource>& textureOut);

        /// Create the BufferResource using the renderer from the contents of inputDesc
    static Slang::Result createBufferResource(
        const InputBufferDesc& inputDesc,
        bool isOutput,
        size_t bufferSize,
        const void* initData,
        IRenderer* renderer,
        Slang::RefPtr<BufferResource>& bufferOut);

        /// Create BindingState::Desc from the contents of layout
    static Slang::Result createBindingState(
        const ShaderInputLayout& layout,
        IRenderer* renderer,
        BufferResource* addedConstantBuffer,
        BindingStateImpl** outBindingState);

private:
        /// Create BindingState::Desc from a list of ShaderInputLayout entries
    static Slang::Result _createBindingState(
        ShaderInputLayoutEntry* srcEntries,
        int numEntries,
        IRenderer* renderer,
        BufferResource* addedConstantBuffer,
        BindingStateImpl** outBindingState);
};

} // renderer_test