xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/d3d11/shaders/BufferToTexture11.hlsl (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1Buffer<float4>    Buffer4F  : register(t0);
2Buffer<int4>      Buffer4I  : register(t0);
3Buffer<uint4>     Buffer4UI : register(t0);
4
5struct VS_OUTPUT
6{
7    float4 position : SV_Position;
8    uint index      : TEXCOORD0;
9    uint slice      : LAYER;
10};
11
12struct GS_OUTPUT
13{
14    float4 position : SV_Position;
15    uint index      : TEXCOORD0;
16    uint slice      : SV_RenderTargetArrayIndex;
17};
18
19cbuffer BufferCopyParams : register(b0)
20{
21    uint FirstPixelOffset;
22    uint PixelsPerRow;
23    uint RowStride;
24    uint RowsPerSlice;
25    float2 PositionOffset;
26    float2 PositionScale;
27    int2 TexLocationOffset;
28    int2 TexLocationScale;
29    uint FirstSlice;
30}
31
32void ComputePositionAndIndex(uint vertexID, out VS_OUTPUT outVertex)
33{
34    uint PixelsPerSlice = PixelsPerRow * RowsPerSlice;
35    uint SliceStride    = RowStride * RowsPerSlice;
36
37    uint slice          = vertexID / PixelsPerSlice;
38    uint sliceOffset    = slice * PixelsPerSlice;
39    uint row            = (vertexID - sliceOffset) / PixelsPerRow;
40    uint col            = vertexID - sliceOffset - (row * PixelsPerRow);
41
42    float2 coords       = float2(float(col), float(row));
43
44    outVertex.position  = float4(PositionOffset + PositionScale * coords, 0.0f, 1.0f);
45    outVertex.index     = FirstPixelOffset + slice * SliceStride + row * RowStride + col;
46    outVertex.slice     = FirstSlice + slice;
47}
48
49void VS_BufferToTexture(in uint vertexID : SV_VertexID, out VS_OUTPUT outVertex)
50{
51    ComputePositionAndIndex(vertexID, outVertex);
52}
53
54[maxvertexcount(1)]
55void GS_BufferToTexture(point VS_OUTPUT inVertex[1], inout PointStream<GS_OUTPUT> outStream)
56{
57    GS_OUTPUT outVertex;
58    outVertex.position  = inVertex[0].position;
59    outVertex.index     = inVertex[0].index;
60    outVertex.slice     = inVertex[0].slice;
61    outStream.Append(outVertex);
62}
63
64float4 PS_BufferToTexture_4F(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target
65{
66    return Buffer4F.Load(inIndex);
67}
68
69int4 PS_BufferToTexture_4I(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target
70{
71    return Buffer4I.Load(inIndex);
72}
73
74uint4 PS_BufferToTexture_4UI(in float4 inPosition : SV_Position, in uint inIndex : TEXCOORD0) : SV_Target
75{
76    return Buffer4UI.Load(inIndex);
77}
78