First Commit

This commit is contained in:
2025-02-06 22:24:29 +08:00
parent ed7df4c81e
commit 7539e6a53c
18116 changed files with 6181499 additions and 0 deletions

View File

@ -0,0 +1,163 @@
{
"$id": "https://gpuopen.com/vulkan-memory-allocator/schemas/GpuMemDump",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"General": {
"type": "object",
"properties": {
"API": {"type": "string", "enum": ["Vulkan", "Direct3D 12"]},
"GPU": {"type": "string"}
},
"required": ["API", "GPU"]
},
"Total": {"$ref": "#/$defs/Stats"},
"MemoryInfo": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"Flags": {
"type": "array",
"items": {"type": "string"}
},
"Size": {"type": "integer"},
"Budget": {
"type": "object",
"properties": {
"BudgetBytes": {"type": "integer"},
"UsageBytes": {"type": "integer"}
},
"additionalProperties": false
},
"Stats": {"$ref": "#/$defs/Stats"},
"MemoryPools": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"Flags": {
"type": "array",
"items": {"type": "string"}
},
"Stats": {"$ref": "#/$defs/Stats"}
},
"additionalProperties": false
}
}
},
"required": ["Budget", "Stats"],
"additionalProperties": false
}
},
"DefaultPools": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"PreferredBlockSize": {"type": "integer"},
"Blocks": {
"type": "object",
"propertyNames": {"pattern": "[0-9]+"},
"additionalProperties": {"$ref": "#/$defs/Block"}
},
"DedicatedAllocations": {
"type": "array",
"items": {"$ref": "#/$defs/DedicatedAllocation"}
}
}
}
},
"CustomPools": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "object",
"properties": {
"Name": {"type": "string"},
"Flags": {"type": "array"},
"PreferredBlockSize": {"type": "integer"},
"Blocks": {
"type": "object",
"additionalProperties": {"$ref": "#/$defs/Block"}
},
"DedicatedAllocations": {
"type": "array",
"items": {"$ref": "#/$defs/DedicatedAllocation"}
}
},
"required": ["PreferredBlockSize"],
"additionalProperties": false
}
}
}
},
"required": ["General", "Total", "MemoryInfo"],
"additionalProperties": false,
"$defs": {
"CustomData": {
"type": "string",
"pattern": "^[0-9a-zA-Z]+$"
},
"Stats": {
"type": "object",
"properties": {
"BlockCount": {"type": "integer"},
"BlockBytes": {"type": "integer"},
"AllocationCount": {"type": "integer"},
"AllocationBytes": {"type": "integer"},
"UnusedRangeCount": {"type": "integer"},
"AllocationSizeMin": {"type": "integer"},
"AllocationSizeMax": {"type": "integer"},
"UnusedRangeSizeMin": {"type": "integer"},
"UnusedRangeSizeMax": {"type": "integer"}
},
"required": [
"BlockCount", "BlockBytes",
"AllocationCount", "AllocationBytes",
"UnusedRangeCount"
],
"additionalProperties": false
},
"Block": {
"type": "object",
"properties": {
"MapRefCount": {"type": "integer"},
"TotalBytes": {"type": "integer"},
"UnusedBytes": {"type": "integer"},
"Allocations": {"type": "integer"},
"UnusedRanges": {"type": "integer"},
"Suballocations": {"type": "array", "items": {"$ref": "#/$defs/Suballocation"}}
},
"required": ["TotalBytes", "UnusedBytes", "Allocations", "UnusedRanges"]
},
"DedicatedAllocation": {
"type": "object",
"properties": {
"Type": {"type": "string"},
"Size": {"type": "integer"},
"Usage": {"type": "integer"},
"CustomData": {"$ref": "#/$defs/CustomData"},
"Name": {"type": "string"},
"Layout": {"type": "integer"}
},
"required": ["Type", "Size"],
"additionalProperties": false
},
"Suballocation": {
"type": "object",
"properties": {
"Offset": {"type": "integer"},
"Type": {"type": "string"},
"Size": {"type": "integer"},
"Usage": {"type": "integer"},
"CustomData": {"$ref": "#/$defs/CustomData"},
"Name": {"type": "string"},
"Layout": {"type": "integer"}
},
"required": ["Offset", "Type", "Size"],
"additionalProperties": false
}
}
}

View File

@ -0,0 +1,334 @@
#
# Copyright (c) 2018-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.
#
import argparse
import json
from PIL import Image, ImageDraw, ImageFont
PROGRAM_VERSION = 'Vulkan/D3D12 Memory Allocator Dump Visualization 3.0.4'
IMG_WIDTH = 1200
IMG_MARGIN = 8
TEXT_MARGIN = 4
FONT_SIZE = 10
MAP_SIZE = 24
COLOR_TEXT_H1 = (0, 0, 0, 255)
COLOR_TEXT_H2 = (150, 150, 150, 255)
COLOR_OUTLINE = (155, 155, 155, 255)
COLOR_OUTLINE_HARD = (0, 0, 0, 255)
COLOR_GRID_LINE = (224, 224, 224, 255)
currentApi = ""
data = {}
def ParseArgs():
argParser = argparse.ArgumentParser(description='Visualization of Vulkan/D3D12 Memory Allocator JSON dump.')
argParser.add_argument('DumpFile', help='Path to source JSON file with memory dump created by Vulkan/D3D12 Memory Allocator library')
argParser.add_argument('-v', '--version', action='version', version=PROGRAM_VERSION)
argParser.add_argument('-o', '--output', required=True, help='Path to destination image file (e.g. PNG)')
return argParser.parse_args()
def GetDataForMemoryPool(poolTypeName):
global data
if poolTypeName in data:
return data[poolTypeName]
else:
newPoolData = {'DedicatedAllocations':[], 'Blocks':[], 'CustomPools':{}}
data[poolTypeName] = newPoolData
return newPoolData
def ProcessBlock(poolData, block):
blockInfo = {'ID': block[0], 'Size': int(block[1]['TotalBytes']), 'Suballocations':[]}
for alloc in block[1]['Suballocations']:
allocData = {'Type': alloc['Type'], 'Size': int(alloc['Size']), 'Usage': int(alloc['Usage']) if 'Usage' in alloc else 0 }
blockInfo['Suballocations'].append(allocData)
poolData['Blocks'].append(blockInfo)
def IsDataEmpty():
global data
for poolData in data.values():
if len(poolData['DedicatedAllocations']) > 0:
return False
if len(poolData['Blocks']) > 0:
return False
for customPool in poolData['CustomPools'].values():
if len(customPool['Blocks']) > 0:
return False
if len(customPool['DedicatedAllocations']) > 0:
return False
return True
def RemoveEmptyType():
global data
for poolType in list(data.keys()):
pool = data[poolType]
if len(pool['DedicatedAllocations']) > 0:
continue
if len(pool['Blocks']) > 0:
continue
empty = True
for customPool in pool['CustomPools'].values():
if len(customPool['Blocks']) > 0:
empty = False
break
if len(customPool['DedicatedAllocations']) > 0:
empty = False
break
if empty:
del data[poolType]
# Returns tuple:
# [0] image height : integer
# [1] pixels per byte : float
def CalcParams():
global data
height = IMG_MARGIN
height += FONT_SIZE + IMG_MARGIN # Grid lines legend - sizes
maxBlockSize = 0
# Get height occupied by every memory pool
for poolData in data.values():
height += FONT_SIZE + IMG_MARGIN # Memory pool title
height += len(poolData['Blocks']) * (FONT_SIZE + MAP_SIZE + IMG_MARGIN * 2)
height += len(poolData['DedicatedAllocations']) * (FONT_SIZE + MAP_SIZE + IMG_MARGIN * 2)
# Get longest block size
for dedicatedAlloc in poolData['DedicatedAllocations']:
maxBlockSize = max(maxBlockSize, dedicatedAlloc['Size'])
for block in poolData['Blocks']:
maxBlockSize = max(maxBlockSize, block['Size'])
# Same for custom pools
for customPoolData in poolData['CustomPools'].values():
height += len(customPoolData['Blocks']) * (FONT_SIZE + MAP_SIZE + IMG_MARGIN * 2)
height += len(customPoolData['DedicatedAllocations']) * (FONT_SIZE + MAP_SIZE + IMG_MARGIN * 2)
# Get longest block size
for dedicatedAlloc in customPoolData['DedicatedAllocations']:
maxBlockSize = max(maxBlockSize, dedicatedAlloc['Size'])
for block in customPoolData['Blocks']:
maxBlockSize = max(maxBlockSize, block['Size'])
return height, (IMG_WIDTH - IMG_MARGIN * 2) / float(maxBlockSize)
def BytesToStr(bytes):
if bytes < 1024:
return "%d B" % bytes
bytes /= 1024
if bytes < 1024:
return "%d KiB" % bytes
bytes /= 1024
if bytes < 1024:
return "%d MiB" % bytes
bytes /= 1024
return "%d GiB" % bytes
def TypeToColor(type, usage):
global currentApi
if type == 'FREE':
return 220, 220, 220, 255
elif type == 'UNKNOWN':
return 175, 175, 175, 255 # Gray
if currentApi == 'Vulkan':
if type == 'BUFFER':
if (usage & 0x1C0) != 0: # INDIRECT_BUFFER | VERTEX_BUFFER | INDEX_BUFFER
return 255, 148, 148, 255 # Red
elif (usage & 0x28) != 0: # STORAGE_BUFFER | STORAGE_TEXEL_BUFFER
return 255, 187, 121, 255 # Orange
elif (usage & 0x14) != 0: # UNIFORM_BUFFER | UNIFORM_TEXEL_BUFFER
return 255, 255, 0, 255 # Yellow
else:
return 255, 255, 165, 255 # Light yellow
elif type == 'IMAGE_OPTIMAL':
if (usage & 0x20) != 0: # DEPTH_STENCIL_ATTACHMENT
return 246, 128, 255, 255 # Pink
elif (usage & 0xD8) != 0: # INPUT_ATTACHMENT | TRANSIENT_ATTACHMENT | COLOR_ATTACHMENT | STORAGE
return 179, 179, 255, 255 # Blue
elif (usage & 0x4) != 0: # SAMPLED
return 0, 255, 255, 255 # Aqua
else:
return 183, 255, 255, 255 # Light aqua
elif type == 'IMAGE_LINEAR' :
return 0, 255, 0, 255 # Green
elif type == 'IMAGE_UNKNOWN':
return 0, 255, 164, 255 # Green/aqua
elif currentApi == 'Direct3D 12':
if type == 'BUFFER':
return 255, 255, 165, 255 # Light yellow
elif type == 'TEXTURE1D' or type == 'TEXTURE2D' or type == 'TEXTURE3D':
if (usage & 0x2) != 0: # D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL
return 246, 128, 255, 255 # Pink
elif (usage & 0x5) != 0: # D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS
return 179, 179, 255, 255 # Blue
elif (usage & 0x8) == 0: # Not having D3D12_RESOURCE_FLAG_DENY_SHARED_RESOURCE
return 0, 255, 255, 255 # Aqua
else:
return 183, 255, 255, 255 # Light aqua
else:
print("Unknown graphics API!")
exit(1)
assert False
return 0, 0, 0, 255
def DrawBlock(draw, y, block, pixelsPerByte):
sizePixels = int(block['Size'] * pixelsPerByte)
draw.rectangle([IMG_MARGIN, y, IMG_MARGIN + sizePixels, y + MAP_SIZE], fill=TypeToColor('FREE', 0), outline=None)
byte = 0
x = 0
lastHardLineX = -1
for alloc in block['Suballocations']:
byteEnd = byte + alloc['Size']
xEnd = int(byteEnd * pixelsPerByte)
if alloc['Type'] != 'FREE':
if xEnd > x + 1:
draw.rectangle([IMG_MARGIN + x, y, IMG_MARGIN + xEnd, y + MAP_SIZE], fill=TypeToColor(alloc['Type'], alloc['Usage']), outline=COLOR_OUTLINE)
# Hard line was been overwritten by rectangle outline: redraw it.
if lastHardLineX == x:
draw.line([IMG_MARGIN + x, y, IMG_MARGIN + x, y + MAP_SIZE], fill=COLOR_OUTLINE_HARD)
else:
draw.line([IMG_MARGIN + x, y, IMG_MARGIN + x, y + MAP_SIZE], fill=COLOR_OUTLINE_HARD)
lastHardLineX = x
byte = byteEnd
x = xEnd
def DrawDedicatedAllocationBlock(draw, y, dedicatedAlloc, pixelsPerByte):
sizePixels = int(dedicatedAlloc['Size'] * pixelsPerByte)
draw.rectangle([IMG_MARGIN, y, IMG_MARGIN + sizePixels, y + MAP_SIZE], fill=TypeToColor(dedicatedAlloc['Type'], dedicatedAlloc['Usage']), outline=COLOR_OUTLINE)
if __name__ == '__main__':
args = ParseArgs()
jsonSrc = json.load(open(args.DumpFile, 'rb'))
if 'General' in jsonSrc:
currentApi = jsonSrc['General']['API']
else:
print("Wrong JSON format, cannot determine graphics API!")
exit(1)
# Process default pools
if 'DefaultPools' in jsonSrc:
for memoryPool in jsonSrc['DefaultPools'].items():
poolData = GetDataForMemoryPool(memoryPool[0])
# Get dedicated allocations
for dedicatedAlloc in memoryPool[1]['DedicatedAllocations']:
allocData = {'Type': dedicatedAlloc['Type'], 'Size': int(dedicatedAlloc['Size']), 'Usage': int(dedicatedAlloc['Usage'])}
poolData['DedicatedAllocations'].append(allocData)
# Get allocations in block vectors
for block in memoryPool[1]['Blocks'].items():
ProcessBlock(poolData, block)
# Process custom pools
if 'CustomPools' in jsonSrc:
for memoryPool in jsonSrc['CustomPools'].items():
poolData = GetDataForMemoryPool(memoryPool[0])
for pool in memoryPool[1]:
poolName = pool['Name']
poolData['CustomPools'][poolName] = {'DedicatedAllocations':[], 'Blocks':[]}
# Get dedicated allocations
for dedicatedAlloc in pool['DedicatedAllocations']:
allocData = {'Type': dedicatedAlloc['Type'], 'Size': int(dedicatedAlloc['Size']), 'Usage': int(dedicatedAlloc['Usage'])}
poolData['CustomPools'][poolName]['DedicatedAllocations'].append(allocData)
# Get allocations in block vectors
for block in pool['Blocks'].items():
ProcessBlock(poolData['CustomPools'][poolName], block)
if IsDataEmpty():
print("There is nothing to put on the image. Please make sure you generated the stats string with detailed map enabled.")
exit(1)
RemoveEmptyType()
# Calculate dimmensions and create data image
imgHeight, pixelsPerByte = CalcParams()
img = Image.new('RGB', (IMG_WIDTH, imgHeight), 'white')
draw = ImageDraw.Draw(img)
try:
font = ImageFont.truetype('segoeuib.ttf')
except:
font = ImageFont.load_default()
# Draw grid lines
bytesBetweenGridLines = 32
while bytesBetweenGridLines * pixelsPerByte < 64:
bytesBetweenGridLines *= 2
byte = 0
y = IMG_MARGIN
while True:
x = int(byte * pixelsPerByte)
if x > IMG_WIDTH - 2 * IMG_MARGIN:
break
draw.line([x + IMG_MARGIN, 0, x + IMG_MARGIN, imgHeight], fill=COLOR_GRID_LINE)
if byte == 0:
draw.text((x + IMG_MARGIN + TEXT_MARGIN, y), "0", fill=COLOR_TEXT_H2, font=font)
else:
text = BytesToStr(byte)
textLength = draw.textlength(text, font=font)
draw.text((x + IMG_MARGIN - textLength - TEXT_MARGIN, y), text, fill=COLOR_TEXT_H2, font=font)
byte += bytesBetweenGridLines
y += FONT_SIZE + IMG_MARGIN
# Draw main content
for memType in sorted(data.keys()):
memPoolData = data[memType]
draw.text((IMG_MARGIN, y), "Memory pool %s" % memType, fill=COLOR_TEXT_H1, font=font)
y += FONT_SIZE + IMG_MARGIN
# Draw block vectors
for block in memPoolData['Blocks']:
draw.text((IMG_MARGIN, y), "Default pool block %s" % block['ID'], fill=COLOR_TEXT_H2, font=font)
y += FONT_SIZE + IMG_MARGIN
DrawBlock(draw, y, block, pixelsPerByte)
y += MAP_SIZE + IMG_MARGIN
index = 0
# Draw dedicated allocations
for dedicatedAlloc in memPoolData['DedicatedAllocations']:
draw.text((IMG_MARGIN, y), "Dedicated allocation %d" % index, fill=COLOR_TEXT_H2, font=font)
y += FONT_SIZE + IMG_MARGIN
DrawDedicatedAllocationBlock(draw, y, dedicatedAlloc, pixelsPerByte)
y += MAP_SIZE + IMG_MARGIN
index += 1
for poolName, pool in memPoolData['CustomPools'].items():
for block in pool['Blocks']:
draw.text((IMG_MARGIN, y), "Custom pool %s block %s" % (poolName, block['ID']), fill=COLOR_TEXT_H2, font=font)
y += FONT_SIZE + IMG_MARGIN
DrawBlock(draw, y, block, pixelsPerByte)
y += MAP_SIZE + IMG_MARGIN
index = 0
for dedicatedAlloc in pool['DedicatedAllocations']:
draw.text((IMG_MARGIN, y), "Custom pool %s dedicated allocation %d" % (poolName, index), fill=COLOR_TEXT_H2, font=font)
y += FONT_SIZE + IMG_MARGIN
DrawDedicatedAllocationBlock(draw, y, dedicatedAlloc, pixelsPerByte)
y += MAP_SIZE + IMG_MARGIN
index += 1
del draw
img.save(args.output)
"""
Main data structure - variable `data` - is a dictionary. Key is string - memory type name. Value is dictionary of:
- Fixed key 'DedicatedAllocations'. Value is list of objects, each containing dictionary with:
- Fixed key 'Type'. Value is string.
- Fixed key 'Size'. Value is int.
- Fixed key 'Usage'. Value is int.
- Fixed key 'Blocks'. Value is list of objects, each containing dictionary with:
- Fixed key 'ID'. Value is int.
- Fixed key 'Size'. Value is int.
- Fixed key 'Suballocations'. Value is list of objects as above.
- Fixed key 'CustomPools'. Value is dictionary.
- Key is string with pool ID/name. Value is a dictionary with:
- Fixed key 'DedicatedAllocations'. Value is list of objects as above.
- Fixed key 'Blocks'. Value is a list of objects representing memory blocks as above.
"""

View File

@ -0,0 +1,49 @@
# GpuMemDumpVis
Vulkan/D3D12 Memory Allocator Dump Visualization.
It is an auxiliary tool that can visualize internal state of [Vulkan Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator) and
[D3D12 Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator) libraries on a picture.
It is a Python script that must be launched from command line with appropriate parameters.
## Requirements
- Python 3 installed
- [Pillow](http://python-pillow.org/) - Python Imaging Library (Fork) installed
## Usage
```
python GpuMemDumpVis.py -o OUTPUT_FILE INPUT_FILE
```
* `INPUT_FILE` - path to source file to be read, containing dump of internal state of the VMA/D3D12MA library in JSON format (encoding: UTF-8/UTF-16), generated using `vmaBuildStatsString()` and `D3D12MA::Allocator::BuildStatsString()` functions.
* `OUTPUT_FILE` - path to destination file to be written that will contain generated image. Image format is automatically recognized based on file extension. List of supported formats can be found [here](http://pillow.readthedocs.io/en/latest/handbook/image-file-formats.html) and includes: BMP, GIF, JPEG, PNG, TGA.
You can also use typical options:
* `-h` - to see help on command line syntax
* `-v` - to see program version number
## Example output
![Example output](README_files/ExampleOutput.png "Example output")
## Legend
* ![Free space](README_files/Legend_Bkg.png "Free space") Light gray without border - a space in Vulkan device memory block unused by any allocation.
* ![Buffer 1](README_files/Legend_Buffer_1.png "Buffer 1") Buffer with usage containing INDIRECT_BUFFER, VERTEX_BUFFER, or INDEX_BUFFER (Vulkan).
* ![Buffer 2](README_files/Legend_Buffer_2.png "Buffer 2") Buffer with usage containing STORAGE_BUFFER or STORAGE_TEXEL_BUFFER (Vulkan).
* ![Buffer 3](README_files/Legend_Buffer_3.png "Buffer 3") Buffer with usage containing UNIFORM_BUFFER or UNIFORM_TEXEL_BUFFER (Vulkan).
* ![Buffer 4](README_files/Legend_Buffer_4.png "Buffer 4") Other buffer.
* ![Image 1](README_files/Legend_Image_1.png "Image 1") Image with OPTIMAL tiling and usage containing DEPTH_STENCIL_ATTACHMENT (Vulkan) or a texture with usage containing D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL (D3D12).
* ![Image 2](README_files/Legend_Image_2.png "Image 2") Image with OPTIMAL tiling and usage containing INPUT_ATTACHMENT, TRANSIENT_ATTACHMENT, COLOR_ATTACHMENT, or STORAGE (Vulkan), or a texture with usage containing D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET or D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS (D3D12).
* ![Image 3](README_files/Legend_Image_3.png "Image 3") Image with OPTIMAL tiling and usage containing SAMPLED (Vulkan) or a texture with usage not containing D3D12_RESOURCE_FLAG_DENY_SHARED_RESOURCE (D3D12).
* ![Image 4](README_files/Legend_Image_4.png "Image 4") Other image with OPTIMAL tiling (Vulkan) or a texture (D3D12).
* ![Image Linear](README_files/Legend_Image_Linear.png "Image Linear") Image with LINEAR tiling (Vulkan).
* ![Image Unknown](README_files/Legend_Image_Unknown.png "Image Unknown") Image with tiling unknown to the allocator (Vulkan).
* ![Unknown](README_files/Legend_Unknown.png "Unknown") Allocation of unknown type.
* ![Details](README_files/Legend_Details.png "Details") Black bar - one or more allocations of any kind too small to be visualized as filled rectangles.
## Additional notes
Warning! Current version of the tool shows incorrect result when allocations alias (overlap) in memory, as it only looks at sizes of the allocations, not their offsets.

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,426 @@
{
"General": {
"API": "Vulkan",
"apiVersion": "1.3.203",
"GPU": "AMD Radeon RX 6600 XT",
"deviceType": 2,
"maxMemoryAllocationCount": 4096,
"bufferImageGranularity": 1,
"nonCoherentAtomSize": 128,
"memoryHeapCount": 2,
"memoryTypeCount": 8
},
"Total": {
"BlockCount": 69,
"BlockBytes": 201392128,
"AllocationCount": 132,
"AllocationBytes": 73401500,
"UnusedRangeCount": 11,
"AllocationSizeMin": 60,
"AllocationSizeMax": 6095200,
"UnusedRangeSizeMin": 196,
"UnusedRangeSizeMax": 33550336
},
"MemoryInfo": {
"Heap 0": {
"Flags": [],
"Size": 16862150656,
"Budget": {
"BudgetBytes": 16325847040,
"UsageBytes": 122392576
},
"Stats": {
"BlockCount": 35,
"BlockBytes": 117473280,
"AllocationCount": 64,
"AllocationBytes": 33619968,
"UnusedRangeCount": 5,
"AllocationSizeMin": 1024,
"AllocationSizeMax": 2097152,
"UnusedRangeSizeMin": 49152,
"UnusedRangeSizeMax": 33550336
},
"MemoryPools": {
"Type 1": {
"Flags": ["HOST_VISIBLE", "HOST_COHERENT"],
"Stats": {
"BlockCount": 5,
"BlockBytes": 33558528,
"AllocationCount": 8,
"AllocationBytes": 8192,
"UnusedRangeCount": 1,
"AllocationSizeMin": 1024,
"AllocationSizeMax": 1024
}
},
"Type 3": {
"Flags": ["HOST_VISIBLE", "HOST_COHERENT", "HOST_CACHED"],
"Stats": {
"BlockCount": 30,
"BlockBytes": 83914752,
"AllocationCount": 56,
"AllocationBytes": 33611776,
"UnusedRangeCount": 4,
"AllocationSizeMin": 1024,
"AllocationSizeMax": 2097152,
"UnusedRangeSizeMin": 49152,
"UnusedRangeSizeMax": 25100288
}
},
"Type 5": {
"Flags": ["HOST_VISIBLE", "HOST_COHERENT", "DEVICE_COHERENT_AMD", "DEVICE_UNCACHED_AMD"],
"Stats": {
"BlockCount": 0,
"BlockBytes": 0,
"AllocationCount": 0,
"AllocationBytes": 0,
"UnusedRangeCount": 0
}
},
"Type 7": {
"Flags": ["HOST_VISIBLE", "HOST_COHERENT", "HOST_CACHED", "DEVICE_COHERENT_AMD", "DEVICE_UNCACHED_AMD"],
"Stats": {
"BlockCount": 0,
"BlockBytes": 0,
"AllocationCount": 0,
"AllocationBytes": 0,
"UnusedRangeCount": 0
}
}
}
},
"Heap 1": {
"Flags": ["DEVICE_LOCAL", "MULTI_INSTANCE"],
"Size": 8573157376,
"Budget": {
"BudgetBytes": 7737008128,
"UsageBytes": 155025408
},
"Stats": {
"BlockCount": 34,
"BlockBytes": 83918848,
"AllocationCount": 68,
"AllocationBytes": 39781532,
"UnusedRangeCount": 6,
"AllocationSizeMin": 60,
"AllocationSizeMax": 6095200,
"UnusedRangeSizeMin": 196,
"UnusedRangeSizeMax": 25100288
},
"MemoryPools": {
"Type 0": {
"Flags": ["DEVICE_LOCAL"],
"Stats": {
"BlockCount": 34,
"BlockBytes": 83918848,
"AllocationCount": 68,
"AllocationBytes": 39781532,
"UnusedRangeCount": 6,
"AllocationSizeMin": 60,
"AllocationSizeMax": 6095200,
"UnusedRangeSizeMin": 196,
"UnusedRangeSizeMax": 25100288
}
},
"Type 2": {
"Flags": ["DEVICE_LOCAL", "HOST_VISIBLE", "HOST_COHERENT"],
"Stats": {
"BlockCount": 0,
"BlockBytes": 0,
"AllocationCount": 0,
"AllocationBytes": 0,
"UnusedRangeCount": 0
}
},
"Type 4": {
"Flags": ["DEVICE_LOCAL", "DEVICE_COHERENT_AMD", "DEVICE_UNCACHED_AMD"],
"Stats": {
"BlockCount": 0,
"BlockBytes": 0,
"AllocationCount": 0,
"AllocationBytes": 0,
"UnusedRangeCount": 0
}
},
"Type 6": {
"Flags": ["DEVICE_LOCAL", "HOST_VISIBLE", "HOST_COHERENT", "DEVICE_COHERENT_AMD", "DEVICE_UNCACHED_AMD"],
"Stats": {
"BlockCount": 0,
"BlockBytes": 0,
"AllocationCount": 0,
"AllocationBytes": 0,
"UnusedRangeCount": 0
}
}
}
}
},
"DefaultPools": {
"Type 0": {
"PreferredBlockSize": 268435456,
"Blocks": {
"0": {
"MapRefCount": 0,
"TotalBytes": 33554432,
"UnusedBytes": 18987876,
"Allocations": 20,
"UnusedRanges": 4,
"Suballocations": [
{"Offset": 0, "Type": "IMAGE_OPTIMAL", "Size": 65536, "Usage": 6},
{"Offset": 65536, "Type": "BUFFER", "Size": 768, "Usage": 130},
{"Offset": 66304, "Type": "BUFFER", "Size": 60, "Usage": 66},
{"Offset": 66364, "Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Offset": 67388, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Offset": 68412, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Offset": 69436, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 70460, "Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Offset": 71484, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Offset": 72508, "Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Offset": 73532, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 74556, "Type": "FREE", "Size": 196},
{"Offset": 74752, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Offset": 76800, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 78848, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 80896, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 82944, "Type": "FREE", "Size": 48128},
{"Offset": 131072, "Type": "IMAGE_OPTIMAL", "Size": 6095200, "Usage": 32},
{"Offset": 6226272, "Type": "FREE", "Size": 65184},
{"Offset": 6291456, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Offset": 8388608, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 10485760, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 12582912, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 14680064, "Type": "FREE", "Size": 18874368}
]
}
},
"DedicatedAllocations": [
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"}
]
},
"Type 1": {
"PreferredBlockSize": 268435456,
"Blocks": {
"0": {
"MapRefCount": 0,
"TotalBytes": 33554432,
"UnusedBytes": 33550336,
"Allocations": 4,
"UnusedRanges": 1,
"Suballocations": [
{"Offset": 0, "Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Offset": 1024, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Offset": 2048, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Offset": 3072, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 4096, "Type": "FREE", "Size": 33550336}
]
}
},
"DedicatedAllocations": [
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"}
]
},
"Type 2": {
"PreferredBlockSize": 268435456,
"Blocks": {
},
"DedicatedAllocations": [
]
},
"Type 3": {
"PreferredBlockSize": 268435456,
"Blocks": {
"0": {
"MapRefCount": 0,
"TotalBytes": 33554432,
"UnusedBytes": 25153536,
"Allocations": 12,
"UnusedRanges": 2,
"Suballocations": [
{"Offset": 0, "Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Offset": 1024, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Offset": 2048, "Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Offset": 3072, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 4096, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Offset": 6144, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 8192, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 10240, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 12288, "Type": "FREE", "Size": 53248},
{"Offset": 65536, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Offset": 2162688, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 4259840, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 6356992, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 8454144, "Type": "FREE", "Size": 25100288}
]
}
},
"DedicatedAllocations": [
{"Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"}
]
},
"Type 4": {
"PreferredBlockSize": 268435456,
"Blocks": {
},
"DedicatedAllocations": [
]
},
"Type 5": {
"PreferredBlockSize": 268435456,
"Blocks": {
},
"DedicatedAllocations": [
]
},
"Type 6": {
"PreferredBlockSize": 268435456,
"Blocks": {
},
"DedicatedAllocations": [
]
},
"Type 7": {
"PreferredBlockSize": 268435456,
"Blocks": {
},
"DedicatedAllocations": [
]
}
},
"CustomPools": {
"Type 0": [
{
"Name": "0",
"PreferredBlockSize": 268435456,
"Blocks": {
"0": {
"MapRefCount": 0,
"TotalBytes": 33554432,
"UnusedBytes": 25149440,
"Allocations": 16,
"UnusedRanges": 2,
"Suballocations": [
{"Offset": 0, "Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Offset": 1024, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Offset": 2048, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Offset": 3072, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 4096, "Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Offset": 5120, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Offset": 6144, "Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Offset": 7168, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 8192, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Offset": 10240, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 12288, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 14336, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 16384, "Type": "FREE", "Size": 49152},
{"Offset": 65536, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Offset": 2162688, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 4259840, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 6356992, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 8454144, "Type": "FREE", "Size": 25100288}
]
}
},
"DedicatedAllocations": [
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"}
]
}
],
"Type 3": [
{
"Name": "0",
"PreferredBlockSize": 268435456,
"Blocks": {
"0": {
"MapRefCount": 0,
"TotalBytes": 33554432,
"UnusedBytes": 25149440,
"Allocations": 16,
"UnusedRanges": 2,
"Suballocations": [
{"Offset": 0, "Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Offset": 1024, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Offset": 2048, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Offset": 3072, "Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 4096, "Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Offset": 5120, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Offset": 6144, "Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Offset": 7168, "Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 8192, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Offset": 10240, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 12288, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 14336, "Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 16384, "Type": "FREE", "Size": 49152},
{"Offset": 65536, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Offset": 2162688, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Offset": 4259840, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Offset": 6356992, "Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Offset": 8454144, "Type": "FREE", "Size": 25100288}
]
}
},
"DedicatedAllocations": [
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "0000000000F5D987"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "Name": "SHEPURD"},
{"Type": "UNKNOWN", "Size": 1024, "Usage": 0, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "0000000000F5D987"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "Name": "SHEPURD"},
{"Type": "BUFFER", "Size": 1024, "Usage": 3, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_LINEAR", "Size": 2048, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "0000000000F5D987"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "Name": "SHEPURD"},
{"Type": "IMAGE_OPTIMAL", "Size": 2097152, "Usage": 7, "CustomData": "00000000018CE96A", "Name": "JOKER"}
]
}
]
}
}