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
|