-
Notifications
You must be signed in to change notification settings - Fork 89
/
palMsaaImageCopyUtil.h
118 lines (105 loc) · 4.74 KB
/
palMsaaImageCopyUtil.h
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
***********************************************************************************************************************
*
* Copyright (c) 2021-2024 Advanced Micro Devices, Inc. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
**********************************************************************************************************************/
#pragma once
#include "palDevice.h"
#include "msaaImageCopy/g_msaaImageCopyComputePipelineInit.h"
/// Forward declarations.
namespace Pal
{
struct SubresId;
class ICmdBuffer;
class IImage;
class IPipeline;
}
namespace GpuUtil
{
///Namespace to encapsulate all constants related to MSAAIMAGECOPY.
namespace MsaaImageCopy
{
constexpr Pal::uint32 ThreadsPerGroupX = 8;
constexpr Pal::uint32 ThreadsPerGroupY = 8;
}
/**
***********************************************************************************************************************
* @class MsaaImageCopyUtil
* @brief MsaaImageCopyUtil is GPU utility which uses PAL core and Utility classes to perform different sample count
* resource's copy using compute shader. The MsaaImageCopyUtil class can be used by clients.
***********************************************************************************************************************
*/
template <typename Allocator>
class MsaaImageCopyUtil
{
public:
MsaaImageCopyUtil(
Pal::IDevice* pDevice,
Allocator* pAllocator);
~MsaaImageCopyUtil();
/// Initializes the MsaaImageCopyUtil class, creating the necessary PAL objects and allocating GPU memory.
///
/// @returns Success if successful, ErrorOutOfMemory if ran out of system memory, ErrorOutOfGpuMemory if ran out of
/// GPU memory for pipeline uploads.
Pal::Result Init();
/// Different sample count resource's blit from source image to
/// destination image using the specified command buffer.
///
/// The added commands are equivalent to a CmdDispatch for synchronization purposes.
/// Only different sample count MSAA image are allowed.
///
/// @param pCmdBuffer The command buffer to add commands to. Command buffer must support compute shader dispatch.
/// @param srcImage Src image for the msaa image copy.
/// @param dstImage Dst image for the msaa image copy.
/// @param regionCount Msaa image copy region count.
/// @param pRegions Msaa image copy regions array.
void MsaaImageCopy(
Pal::ICmdBuffer* pCmdBuffer,
const Pal::IImage& srcImage,
const Pal::IImage& dstImage,
Pal::uint32 regionCount,
const Pal::ImageCopyRegion* pRegions) const;
private:
// Allocates and binds embedded user data.
Pal::uint32* CreateAndBindEmbeddedUserData(
Pal::ICmdBuffer* pCmdBuffer,
Pal::uint32 sizeInDwords,
Pal::uint32 entryToBind) const;
// Populates an ImageViewInfo that wraps the given subres of the provided image object.
void BuildImageViewInfo(
Pal::ImageViewInfo* pInfo,
const Pal::IImage* pImage,
Pal::SubresId subresId,
Pal::SwizzledFormat swizzledFormat,
bool isShaderWriteable) const;
// Device associated with this MsaaImageCopyUtil.
Pal::IDevice*const m_pDevice;
// The system-memory allocator to use.
Allocator* m_pAllocator;
// Pipeline objects.
Pal::IPipeline* m_pPipelines[static_cast<Pal::uint32>(MsaaImageCopy::MsaaImageCopyComputePipeline::Count)];
// Maximum size needed (in DWORDs) to store an SRD.
Pal::uint32 m_maxSrdSizeInDwords;
PAL_DISALLOW_COPY_AND_ASSIGN(MsaaImageCopyUtil);
PAL_DISALLOW_DEFAULT_CTOR(MsaaImageCopyUtil);
};
} // GpuUtil