First Commit
163
externals/vma/tools/GpuMemDumpVis/GpuMemDump.schema.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
334
externals/vma/tools/GpuMemDumpVis/GpuMemDumpVis.py
vendored
Normal 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.
|
||||
"""
|
||||
49
externals/vma/tools/GpuMemDumpVis/README.md
vendored
Normal 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
|
||||
|
||||

|
||||
|
||||
## Legend
|
||||
|
||||
*  Light gray without border - a space in Vulkan device memory block unused by any allocation.
|
||||
*  Buffer with usage containing INDIRECT_BUFFER, VERTEX_BUFFER, or INDEX_BUFFER (Vulkan).
|
||||
*  Buffer with usage containing STORAGE_BUFFER or STORAGE_TEXEL_BUFFER (Vulkan).
|
||||
*  Buffer with usage containing UNIFORM_BUFFER or UNIFORM_TEXEL_BUFFER (Vulkan).
|
||||
*  Other buffer.
|
||||
*  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 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 with OPTIMAL tiling and usage containing SAMPLED (Vulkan) or a texture with usage not containing D3D12_RESOURCE_FLAG_DENY_SHARED_RESOURCE (D3D12).
|
||||
*  Other image with OPTIMAL tiling (Vulkan) or a texture (D3D12).
|
||||
*  Image with LINEAR tiling (Vulkan).
|
||||
*  Image with tiling unknown to the allocator (Vulkan).
|
||||
*  Allocation of unknown type.
|
||||
*  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.
|
||||
BIN
externals/vma/tools/GpuMemDumpVis/README_files/ExampleOutput.png
vendored
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Bkg.png
vendored
Normal file
|
After Width: | Height: | Size: 196 B |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Buffer_1.png
vendored
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Buffer_2.png
vendored
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Buffer_3.png
vendored
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Buffer_4.png
vendored
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Details.png
vendored
Normal file
|
After Width: | Height: | Size: 964 B |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Image_1.png
vendored
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Image_2.png
vendored
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Image_3.png
vendored
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Image_4.png
vendored
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Image_Linear.png
vendored
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Image_Unknown.png
vendored
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
externals/vma/tools/GpuMemDumpVis/README_files/Legend_Unknown.png
vendored
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
426
externals/vma/tools/GpuMemDumpVis/Sample.json
vendored
Normal 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"}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||