<?xml version="1.0" encoding="utf-8"?>
<!-- This file is used to declare overrides for the default memory sizes of various systems. -->
<budgets>

    <!-- ==================================== USEFUL NOTES ====================================
     - You can define heaps and variables here.  The combined size of all heaps will be checked at runtime to ensure they are within memory limits.
     - Heaps are the amount of memory you wish to reserve for a particular system
     - Variables can be used as a useful way to break up a heap into meaningful quantities (as opposed to a magic number) and will NOT count towards the final budget
     - Every heap/variable should define a default size.  Debug, Master, and other special sizes are optional
     - The default size will be used by default.  Otherwise the most appropriate size will be used depending on the build configuration
           (E.g. debug will be used in debug builds, master in master builds etc.)
     - There are also special override types such as fizzbox which will be used iff the budgetstore has been set up to do so at runtime
     - The name attribute of a heap can be used as a reference in other heaps by adding a $ symbol in front
           (E.g. $file_system + 512mb)
     - Referenced heaps and numbers can be added together
     - Use kb and mb suffixes to represent kilobytes and megabytes, otherwise any numbers will be assumed to be in bytes
     - Fractional numbers can be used, such as 2.5mb
   - Sub-heaps made of fixed size block allocators can be defined within heaps using <fixedheap> tags.

    Here is a commented example which demonstrates all of the options available
    
    <variable name="default_size">                  - an arbitrary variable with the name "default_size" (because its a variable it will not count towards the budget)
        <default>1.5mb</default>                    - a necessary default size for this variable.  1.5mb will be converted to 1.5*1024*1024 bytes
    </variable>
    
    <heap name="animation_system">                  - a heap named "animation_system" (because its a heap and not a variable it will count as part of the budget)
        <default>$default_size</default>            - a necessary default size which will be used as a fallback.  note that it references the variable "default_size", so the default value will resolve to 1.5mb
        <debug>$default_size*2</debug>              - this will be used in a debug build in preference to the default value
        <master>$default_size</master>              - this will be used in a master build
        <fizzbox>$default_size+3kb</fizzbox>        - this will be used if BudgetStore::m_overrideType is set to kFizzbox, otherwise default will be used
    </heap>
    
    <heap name="parent_heap">                       - a heap named "parent_heap" (because its a heap and not a variable it will count as part of the budget)
      <default>$default_size</default>              - a necessary default size which will be used as a fallback.  note that it references the variable "default_size", so the default value will resolve to 1.5mb
      <fixedheap blocksize="4" numblocks="128"/>    - a fixedheap subheap to allocate within the parent_heap
      <fixedheap blocksize="8" numblocks="64"/>     - the sub heap will contain 2 fixed block heaps, 1 with 64 blocks of 8 bytes each and 1 with 4 blocks of 128 bytes each
    </heap>
    
    ====================================================================================== -->

	<!-- This is the exact amount of memory not used and can be added to other heaps if needed -->
	<!-- If you reduce any heap size then that memory should be added here unless added to a different heap -->
    <!-- this is the amount of memory left for unheap'ed new/delete/malloc/free calls -->
    <heap name="!spare_memory">
		<!-- Please leave this figure in bytes because it makes merging conflicts much easier -->
		<default>932910+2mb-699kb-16kb-32kb-16kb-200kb-32kb</default>
    </heap>
	
    <!--These are the size definitions of our custom heaps.-->
    <heap name="file_system">
        <default>2.2mb+128kb+41779</default>
    </heap>
    <heap name="manifest_system">
        <default>$manifest_workspacemem</default>
    </heap>
    <heap name="debug_menu">
        <default>1kb</default>
        <debug>1kb</debug>
        <master>1kb</master>
    </heap>

    <variabletool name="debug_memory">
        <default>32mb</default>
    </variabletool>

    <heap name="debug_heap">
        <default>$debug_memory</default>
    </heap>

    <heap name="gag_system">
        <default>256kb</default>
    </heap>
    <heap name="string_store">
        <default>110kb-32kb</default>
    </heap>
    <heap name="havok">
        <default>17.5mb</default>
    </heap>
    <heap name="havok_resources">
        <default>5372kb</default>
    </heap>
    <heap name="vehicle_character_animations">
        <default>2.35mb</default>
    </heap>
    <heap name="physics">
        <default>$fluid_system+896kb+40kb</default>
    </heap>
    <heap name="gui"><!--old ms2 gui ( remove! )-->
        <default>1kb</default>
    </heap>
    <heap name="guile">
		<fixedheap blocksize="8"  numblocks="40000"/>
		<fixedheap blocksize="16"  numblocks="6000"/>
		<fixedheap blocksize="24"  numblocks="10000"/>
		<fixedheap blocksize="32"  numblocks="4000"/>
		<fixedheap blocksize="36"  numblocks="2000"/>
		<fixedheap blocksize="48"  numblocks="4500"/>
		<fixedheap blocksize="108"  numblocks="500"/>
        <default>5mb + 584kb + 128kb + 32kb + 50kb</default>
    </heap>
	<heap name="databinding">
		<default>512kb+16kb+192kb+64kb+30kb</default>
		<fixedheap blocksize="16"  numblocks="30720"/>  	<!-- sizeof(InteriorSyntaxNode) and sizeof(InteriorSyntaxNode) -->
		<fixedheap blocksize="12"  numblocks="11264"/>		<!-- sizeof(LeafSyntaxNode) -->
	</heap>
    <heap name="stl">
        <default>90kb</default>
    </heap>
    <heap name="playerprofile">
        <default>250kb</default>
	<fixedheap blocksize="20"  numblocks="6000"/> <!-- Estimate 1500 values x 4 players, so 6000 values at 20 bytes each --> 
	<fixedheap blocksize="40"  numblocks="1500"/> <!-- Estimate 1500 unique keys requiring 40 bytes each -->
    </heap>
    <heap name="ai">
        <default>900kb</default>
    </heap>
    <heap name="game">
		<!-- 64k for Metric buffers -->
	<default>1.66mb+65536+5kb+100kb</default>
    </heap>
  <heap name="online">
    <default>1mb+512kb</default>
    <fixedheap blocksize="1024" numblocks="1024+512"/>
  </heap>
  <heap name="scene">
        <default>15.75mb+16kb+200kb</default>
        <fixedheap blocksize="128"  numblocks="1500"/>
        <fixedheap blocksize="640"  numblocks="1000"/>
    </heap>
    <heap name="resource_system">
        <default>7.5mb+1mb+706kb</default>
        <debug>20mb</debug>
        <fixedheap blocksize="40"  numblocks="1000"/>
        <fixedheap blocksize="32"  numblocks="1000"/>
        <fixedheap blocksize="20"  numblocks="256"/>
        <fixedheap blocksize="16"  numblocks="256"/>
        <fixedheap blocksize="8"   numblocks="10000"/>
        <fixedheap blocksize="4"   numblocks="1000"/>
    </heap>
    <heap name="variable_store">
        <default>64kb</default>
    </heap>
    <heap name="animation">
        <default>$animationsystem + $road_shear + 1.25mb + 350kb+100kb</default>
    </heap>
    <heap name="avoidance_planner">
        <default>400kb</default>
    </heap>
    <heap name="vehicle_resource">
        <default>3.0mb</default>
    </heap>
    <heap name="audio">
        <default>26.6mb+200kb</default>
    </heap>
    <heap name="music">
      <default>1mb+100kb</default>
    </heap>

  <heap name="renderer">
		<default>20.0mb + $prim3D_renderer_heap_mem + $prim3D_renderer_heap_mem_extra_tool + $main_pushbuffer + $spu_pushbuffer_size_multiplayer + $gchost_extra + $icerenderregions - 30kb</default>
		<fixedheap blocksize="4" numblocks="5008"/>
		<fixedheap blocksize="8" numblocks="6461"/>
		<fixedheap blocksize="12" numblocks="991"/>
		<fixedheap blocksize="16" numblocks="6658"/>
		<fixedheap blocksize="24" numblocks="1182"/>
		<fixedheap blocksize="32" numblocks="12124"/>
		<fixedheap blocksize="36" numblocks="777"/>
		<fixedheap blocksize="48" numblocks="1953"/>
		<fixedheap blocksize="64" numblocks="2866"/>
		<fixedheap blocksize="96" numblocks="18181"/>
		<fixedheap blocksize="128" numblocks="3613"/>
	</heap>

  <heap name="game_particles">
    <default>$particles + $game_particle_system_emitters + 252kb</default>
  </heap>
  <heap name="voice_chat">
    <default>1mb</default>
  </heap>

  <heap name="multiprocessor">
    <default>$JobMemLevel + $JobMemFrame + $JobMemGame + 1.0mb</default>
    <debug>$JobMemLevel + $JobMemFrame + $JobMemGame + 4.0mb</debug>
  </heap>


  <!--Memory reserved for the OS/ELF/PRX-->
  <!-- not actually heaps, just used for accounting -->
  <heap name="!operating_system">
    <default>45mb</default> <!-- will be a multiple of 1mb -->
  </heap>
  <heap name="!elf">
    <default>24mb</default> <!-- must be a multiple of 1mb -->
  </heap>
  <heap name="!prx">
    <default>10mb</default> <!-- must be a multiple of 1mb -->
  </heap>

  <!--System memory left unallocated for use by threads and dynamic prx modules.-->
  <heap name="!threads">
    <default>5mb</default>  <!-- must be a multiple of 1mb -->
  </heap>

	<heap name="scratch">
		<default>2mb</default> <!-- virtual memory so must be multiples of 1Mb, also this comes from system memory not our heaps -->
	        <virtual>96mb</virtual>
        <fixedheap blocksize="32" numblocks="100"/>
	</heap>

    <vram name="GUI">
      <default>30mb</default>
    </vram>

  <!-- ================================================================= -->
	
    <!-- The base (master build) number of verts to give to Prim3D -->
    <variable name="base_max_prim3D_verts">
        <default>17476</default> <!-- Calculated to use almost exactly 1MB of GcHost -->
    </variable>
	
    <!-- Extra verts to give to Prim3D that will come from extra TOOL memory -->
    <!-- I.e. this won't count towards the budget -->
    <variable name="extra_max_prim3D_verts">
        <default>100000</default>
        <master>0</master>
    </variable>
	
	
    <!-- The total number of verts to give to Prim3D accessed only by the game -->
    <variable name="max_prim3D_verts">
        <default>$base_max_prim3D_verts+$extra_max_prim3D_verts</default> 
    </variable>

	<!-- ================================================================= -->
	
	 <!-- The base (master build) number of verts to give to PrimRender -->
    <variable name="base_max_prim_render_verts">
        <default>24192</default>
    </variable>
	
    <!-- Extra verts to give to PrimRender that will come from extra TOOL memory -->
    <!-- I.e. this won't count towards the budget -->
    <variable name="extra_max_prim_render_verts">
        <default>20000</default>
        <master>0</master>
    </variable>
	
    <!-- The total number of verts to give to PrimRender accessed only by the game -->
    <variable name="max_prim_render_verts">
        <default>$base_max_prim_render_verts+$extra_max_prim_render_verts</default> 
    </variable>
		
	<!-- ================================================================= -->
	
	<!-- How much GcHost memory is required for each Prim3D vertex -->
    <!-- The 36 comes from a vertex size of 16bytes and an index of 2 bytes -->
    <!-- plus the fact that the vertex and index buffers are double buffered -->
    <variable name="prim3D_host_mem_per_vert">
        <default>36</default>
    </variable>
	
    <!-- How much renderer heap is required for each Prim3D vertex -->
    <!-- The 26 comes from 16 bytes for m_Prim3DVerts + 8 bytes for m_Prim3DColours -->
    <!-- and m_Prim3DIndices + 2 bytes for m_Prim3DRanges -->
    <variable name="prim3D_heap_mem_per_vert">
        <default>26</default>
    </variable>
	
	<!-- ================================================================= -->
	
    <!-- How much GcHost memory is required for each PrimRender vertex -->
    <!-- The 64 comes from a vertex size of 32bytes-->
    <!-- plus the fact that the vertex and index buffers are double buffered -->
    <variable name="prim_render_host_mem_per_vert">
        <default>64</default>
    </variable>
	
<!-- ==================== HERE WE HAVE TOTALS USED IN HEAPS ========================== -->
    <!-- This is used to extend the renderer and gchost heaps. -->
    <!-- Prim3D is primarily used as a debugging aid, so it is significantly -->
    <!-- smaller in master builds, so the memory used in non-master builds -->
    <!-- does not count towards the budget -->
	
    <!-- How much GcHost memory will be required by Prim3D -->
    <variable name="prim3D_host_mem">
        <default>$base_max_prim3D_verts * $prim3D_host_mem_per_vert</default>
    </variable>
	<!-- Extra used in Tool  mode -->
    <variabletool name="prim3D_host_mem_extra_tool">
        <default>$extra_max_prim3D_verts * $prim3D_host_mem_per_vert</default>
    </variabletool>	
	
    <!-- How much the renderer heap should be increased to accomodate the required -->
    <!-- maximum number of prim3D verts -->
    <variable name="prim3D_renderer_heap_mem">
        <default>$base_max_prim3D_verts * $prim3D_heap_mem_per_vert</default>
    </variable>
	<!--- Extra used in tool mode -->
    <variabletool name="prim3D_renderer_heap_mem_extra_tool">
        <default>$extra_max_prim3D_verts * $prim3D_heap_mem_per_vert</default>
    </variabletool>	

	<!-- ================================================================= -->
		
	<!-- How much GcHost memory will be required by PrimRender -->
    <variable name="prim_render_host_mem">
        <default>$base_max_prim_render_verts * $prim_render_host_mem_per_vert</default>
    </variable>
	<!-- Extra used in Tool  mode -->
    <variabletool name="prim_render_host_mem_extra_tool">
        <default>$extra_max_prim_render_verts * $prim_render_host_mem_per_vert</default>
    </variabletool>	
	
	<!-- ================================================================= -->
	
    <variabletool name="capture_host_buffer">
		<default>5400kb</default>
	  </variabletool>


  <!--Main push buffer total size (it is split in half for double-buffering) -->
  <variable name="main_pushbuffer">
        <default>4mb</default>
    </variable>

    <!--SPU push buffer total sizes (they are split in half). 4 player split screen draw more so needs to be bigger-->
    <variable name="spu_pushbuffer_size_singleplayer">
        <default>9mb</default>
    </variable>
  <variable name="spu_pushbuffer_size_multiplayer">
        <default>9mb</default>
    </variable>
	
	<!--SPU Render bucket buffer-->
    <variable name="spu_renderbucket_size_singleplayer">
        <default>32kb</default>
    </variable>
  <variable name="spu_renderbucket_size_multiplayer">
    <default>32kb</default>
  </variable>

    <!--This is the size of host memory given to Gc, the low level rendering library-->

    <variable name="edgepost">
        <default>8mb</default>
    </variable>

    <variable name="icerenderregions">
      <default>768kb</default>
    </variable>

    <variable name="drawcallmem">
      <default>840kb</default>
    </variable>

    <variable name="gchost_extra">
      <default>8728kb + $prim3D_host_mem +$prim3D_host_mem_extra_tool + $prim_render_host_mem + $prim_render_host_mem_extra_tool + $edgepost + $drawcallmem + $capture_host_buffer</default>
    </variable>

  <!-- The number of entries in the material pool (not the amount of memory used) -->
    <variable name="material_pool_size">
        <default>2048 + 512</default>
    </variable>
	
    <!-- The number of entries in the sampler pool (not the amount of memory used) -->
    <variable name="sampler_pool_size">
        <default>20000</default>
    </variable>
	
    <!-- The number of entries in the index buffer pool (not the amount of memory used) -->
    <variable name="index_buffer_pool_size">
        <default>1024</default>
    </variable>
	
    <!-- The number of entries in the vertex buffer pool (not the amount of memory used) -->
    <variable name="vertex_buffer_pool_size">
        <default>6300</default>
    </variable>
	
    <!-- The number of entries in the mesh pool (not the amount of memory used) -->
    <variable name="mesh_pool_size">
        <default>11000</default>
        <fizzbox>12288</fizzbox>
    </variable>
	
    <!-- The number of entries in the shader pool (not the amount of memory used) -->
    <variable name="shader_pool_size">
        <default>640</default>
    </variable>
	
    <!-- The number of entries in the static_param pool (not the amount of memory used) -->
    <variable name="static_param_pool_size">
        <default>4096</default>
    </variable>
	
    <!-- The number of entries in the auto_param pool (not the amount of memory used) -->
    <variable name="auto_param_pool_size">
        <default>4096</default>
    </variable>
	
    <!--Variables should be placed below this point in the file to avoid confusion-->
	

    <variable name="fluid_system">
        <default>5kb</default>
    </variable>
	

    <variable name="resource_system_load_buffer">
        <!--This has been increased for benchmark mode.  Why is up to 4.2mb of this heap used during loading of downtown??-->
        <default>4mb</default>
        <debug>8mb</debug>
    </variable>

    <variable name="road_shear">
        <default>230kb</default>
    </variable>
    <variable name="animationsystem">
        <default>4.0mb</default>
    </variable>
	

    <variable name="particles">
        <default>3.9mb</default>
    </variable>
	
    <!--Percentages each effect component uses from particles heap out of 100%-->
    <!--Note these don't add up to 100% as some memory is needed for control and reporter structures.-->
    <variable name="particle_system_effects_percent">
        <default>6</default>
    </variable>
    <variable name="particle_system_emitters_percent">
        <default>10</default>
    </variable>
    <variable name="particle_system_effectors_percent">
        <default>1</default>
    </variable>
    <variable name="particle_system_particles_percent">
        <default>71</default>
    </variable>
	
    <!--Memory used for the game particle emitters which are always in memory. These create and destroy particle effects-->
    <variable name="game_particle_system_emitters">
        <default>140kb</default>
    </variable>
	
    <!--These are allocated from within the multiprocessor heap-->
    <variable name="JobMemLevel">
        <default>2.0mb</default>
    </variable>
    <variable name="JobMemFrame">
        <default>4mb</default>
    </variable>
    <variable name="JobMemGame">
        <default>0.0mb</default>
    </variable>
	
    <variabletool name="manifest_workspacemem">
        <default>900kb</default>
        <master>0</master>
    </variabletool>
	
</budgets>
