1104 {
1109
1110
1114 return false;
1115 }
1116
1119 DXGI_FORMAT originalFormat = d3dTex->dxgiFormat();
1120 D3D12_RESOURCE_DESC originalDesc = d3dTex->d3dResource()->GetDesc();
1121
1122 if (
caps.isFormatUnorderedAccessible(originalFormat) &&
1123 (originalDesc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS)) {
1125 } else {
1126
1127 D3D12_RESOURCE_DESC uavDesc = originalDesc;
1128 uavDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
1129
1130 if (!
caps.isFormatUnorderedAccessible(originalFormat)) {
1131
1132 if (
is_bgra(originalFormat)) {
1133 uavDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
1134
1135
1136
1137
1138 if (
caps.standardSwizzleLayoutSupport()) {
1139 uavDesc.Layout = D3D12_TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE;
1140 }
1141
1142
1143
1144 } else {
1145 return false;
1146 }
1147 }
1148
1153 uavDesc,
1154 grProtected,
1156 "RegenerateMipMapLevels");
1157 if (!uavTexture) {
1158 return false;
1159 }
1160
1161 d3dTex->setResourceState(this, D3D12_RESOURCE_STATE_COPY_SOURCE);
1162 if (!
caps.isFormatUnorderedAccessible(originalFormat) &&
is_bgra(originalFormat)) {
1163
1165 D3D12_RESOURCE_STATE_COPY_DEST);
1166
1168 nullptr,
1169 bgraAliasTexture->resource(),
1170 bgraAliasTexture->d3dResource());
1171
1173
1175 bgraAliasTexture->d3dResource(),
1176 uavTexture->resource(),
1177 uavTexture->d3dResource());
1178 } else {
1179
1180 uavTexture->setResourceState(this, D3D12_RESOURCE_STATE_COPY_DEST);
1182 }
1183 }
1184
1185 uint32_t levelCount = d3dTex->mipLevels();
1186
1188
1191
1192
1194 if (!pipeline) {
1195 return false;
1196 }
1198
1199
1201 std::vector<D3D12_CPU_DESCRIPTOR_HANDLE> samplers(1);
1205
1206
1207 D3D12_RESOURCE_STATES currentResourceState = uavTexture->currentState();
1208 D3D12_RESOURCE_TRANSITION_BARRIER barrier;
1209 barrier.pResource = uavTexture->d3dResource();
1210 barrier.Subresource = 0;
1211 barrier.StateBefore = currentResourceState;
1212 barrier.StateAfter = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
1214
1215
1216 for (unsigned int dstMip = 1; dstMip < levelCount; ++dstMip) {
1217 unsigned int srcMip = dstMip - 1;
1220
1221 unsigned int sampleMode = 0;
1223 sampleMode = 1;
1225 sampleMode = 2;
1227 sampleMode = 3;
1228 }
1229
1230
1231 struct {
1233 uint32_t mipLevel;
1234 uint32_t sampleMode;
1235 } constantData = { {1.f /
width, 1.f /
height}, srcMip, sampleMode };
1236
1237 D3D12_GPU_VIRTUAL_ADDRESS constantsAddress =
1241 constantsAddress);
1242
1243 std::vector<D3D12_CPU_DESCRIPTOR_HANDLE> shaderViews;
1244
1247 shaderViews.push_back(srvHandle.
fHandle);
1248 fMipmapCPUDescriptors.
push_back(srvHandle);
1249
1252 shaderViews.push_back(uavHandle.
fHandle);
1253 fMipmapCPUDescriptors.
push_back(uavHandle);
1254
1255
1258
1259
1263 srvTable->baseGpuDescriptor());
1266 samplerTable->baseGpuDescriptor());
1267
1268
1269 barrier.Subresource = dstMip;
1270 barrier.StateBefore = currentResourceState;
1271 barrier.StateAfter = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
1273
1274
1276
1277
1279
1280
1281 barrier.StateBefore = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
1282 barrier.StateAfter = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
1284 }
1285
1286
1287 if (uavTexture.
get() != d3dTex) {
1288 d3dTex->setResourceState(this, D3D12_RESOURCE_STATE_COPY_DEST);
1289 if (bgraAliasTexture) {
1290
1292 uavTexture->d3dResource(),
1293 bgraAliasTexture->resource(),
1294 bgraAliasTexture->d3dResource());
1295
1296 bgraAliasTexture->setResourceState(this, D3D12_RESOURCE_STATE_COPY_SOURCE);
1298 } else {
1299 barrier.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
1300 barrier.StateBefore = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
1301 barrier.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE;
1304 }
1305 } else {
1306
1307
1308
1309 barrier.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
1310 barrier.StateBefore = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
1311 barrier.StateAfter = currentResourceState;
1313 }
1314
1315 return true;
1316}
static bool is_bgra(DXGI_FORMAT format)
static bool is_odd(int x)
sk_sp< T > sk_ref_sp(T *obj)
bool mipmapSupport() const
bool isFormatTexturable(const GrBackendFormat &, GrTextureType) const override
void aliasingBarrier(sk_sp< GrManagedResource > beforeManagedResource, ID3D12Resource *beforeResource, sk_sp< GrManagedResource > afterManagedResource, ID3D12Resource *afterResource)
void copyTextureToTexture(const GrD3DTexture *dst, const GrD3DTexture *src, UINT subresourceIndex=-1)
void uavBarrier(sk_sp< GrManagedResource > managedResource, ID3D12Resource *uavResource)
void setComputeRootConstantBufferView(unsigned int rootParameterIndex, D3D12_GPU_VIRTUAL_ADDRESS bufferLocation)
void addSampledTextureRef(GrD3DTexture *)
void setComputeRootDescriptorTable(unsigned int rootParameterIndex, D3D12_GPU_DESCRIPTOR_HANDLE bufferLocation)
void setDescriptorHeaps(ID3D12DescriptorHeap *srvDescriptorHeap, ID3D12DescriptorHeap *samplerDescriptorHeap)
void setPipelineState(const sk_sp< GrD3DPipeline > &pipeline)
void dispatch(unsigned int threadGroupCountX, unsigned int threadGroupCountY, unsigned int threadGroupCountZ=1)
void setComputeRootSignature(const sk_sp< GrD3DRootSignature > &rootSignature)
void addResourceBarriers(sk_sp< GrManagedResource > resource, int numBarriers, D3D12_RESOURCE_TRANSITION_BARRIER *barriers) const
GrD3DDescriptorHeap::CPUHandle createUnorderedAccessView(ID3D12Resource *resource, unsigned int mipSlice)
GrD3DDescriptorHeap::CPUHandle createShaderResourceView(ID3D12Resource *resource, unsigned int mostDetailedMip=0, unsigned int mipLevels=-1)
D3D12_GPU_VIRTUAL_ADDRESS uploadConstantData(void *data, size_t size)
sk_sp< GrD3DDescriptorTable > findOrCreateShaderViewTable(const std::vector< D3D12_CPU_DESCRIPTOR_HANDLE > &shaderViews)
D3D12_CPU_DESCRIPTOR_HANDLE findOrCreateCompatibleSampler(const GrSamplerState ¶ms)
sk_sp< GrD3DPipeline > findOrCreateMipmapPipeline()
sk_sp< GrD3DDescriptorTable > findOrCreateSamplerTable(const std::vector< D3D12_CPU_DESCRIPTOR_HANDLE > &samplers)
sk_sp< GrD3DRootSignature > findOrCreateRootSignature(int numTextureSamplers, int numUAVs=0)
@ kShaderViewDescriptorTable
@ kSamplerDescriptorTable
static sk_sp< GrD3DTexture > MakeNewTexture(GrD3DGpu *, skgpu::Budgeted, SkISize dimensions, const D3D12_RESOURCE_DESC &, GrProtected, GrMipmapStatus, std::string_view label)
static sk_sp< GrD3DTexture > MakeAliasingTexture(GrD3DGpu *, sk_sp< GrD3DTexture >, const D3D12_RESOURCE_DESC &newDesc, D3D12_RESOURCE_STATES)
SkISize dimensions() const
GrTextureType textureType() const
D3D12_CPU_DESCRIPTOR_HANDLE fHandle