mirror of https://github.com/intel/gmmlib.git
517 lines
30 KiB
C++
517 lines
30 KiB
C++
/*==============================================================================
|
||
Copyright(c) 2017 Intel Corporation
|
||
|
||
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.
|
||
============================================================================*/
|
||
|
||
|
||
|
||
#include "Internal/Common/GmmLibInc.h"
|
||
#include "Internal/Common/Platform/GmmGen10Platform.h"
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////////
|
||
/// Allocates This function will initialize the necessary info based on platform.
|
||
/// - Buffer type restrictions (Eg: Z, Color, Display)
|
||
/// - X/Y tile dimensions
|
||
///
|
||
/// @param[in] Platform: Contains information about platform to initialize an object
|
||
/////////////////////////////////////////////////////////////////////////////////////
|
||
GmmLib::PlatformInfoGen10::PlatformInfoGen10(PLATFORM &Platform)
|
||
: PlatformInfo(Platform)
|
||
{
|
||
__GMM_ASSERTPTR(pGmmGlobalContext, VOIDRETURN);
|
||
|
||
// --------------------------
|
||
// Non Native Dispay Interface buffer restriction. Register Ref: DSPACNTR, DSPASTRIDE, DSPASURF
|
||
// Clamping res based on 2 Nndi buffers and GMM_NNDI_SEGMENT_SIZE reserved gfx memory
|
||
// --------------------------
|
||
Data.Nndi.Alignment = PAGE_SIZE;
|
||
Data.Nndi.PitchAlignment = GMM_BYTES(1);
|
||
Data.Nndi.RenderPitchAlignment = GMM_BYTES(1);
|
||
Data.Nndi.LockPitchAlignment = GMM_BYTES(1);
|
||
Data.Nndi.MinPitch = GMM_BYTES(640);
|
||
Data.Nndi.MaxPitch = GMM_BYTES(8192);
|
||
Data.Nndi.MinAllocationSize = PAGE_SIZE;
|
||
Data.Nndi.MinHeight = GMM_SCANLINES(200);
|
||
Data.Nndi.MinWidth = GMM_PIXELS(320);
|
||
Data.Nndi.MinDepth = 0;
|
||
Data.Nndi.MaxHeight = GMM_BYTES(1536);
|
||
Data.Nndi.MaxWidth = GMM_BYTES(2048);
|
||
Data.Nndi.MaxDepth = 1;
|
||
Data.Nndi.MaxArraySize = 1;
|
||
|
||
// --------------------------
|
||
// Depth Buffer Restriction. Inst Ref: 3DSTATE_DEPTH_BUFFER
|
||
// --------------------------
|
||
Data.Depth.Alignment = PAGE_SIZE;
|
||
Data.Depth.PitchAlignment = GMM_BYTES(64);
|
||
Data.Depth.RenderPitchAlignment = GMM_BYTES(64);
|
||
Data.Depth.LockPitchAlignment = GMM_BYTES(64);
|
||
Data.Depth.MinPitch = GMM_BYTES(64);
|
||
Data.Depth.MaxPitch = GMM_KBYTE(128); // 3DSTATE_DEPTH_BUFFER has conflicting info--but 128KB should be fine.
|
||
Data.Depth.MinAllocationSize = PAGE_SIZE;
|
||
Data.Depth.MinHeight = GMM_SCANLINES(1);
|
||
Data.Depth.MinWidth = GMM_PIXELS(1);
|
||
Data.Depth.MinDepth = 0;
|
||
Data.Depth.MaxHeight = GMM_KBYTE(16);
|
||
Data.Depth.MaxWidth = GMM_KBYTE(16);
|
||
Data.Depth.MaxDepth = GMM_KBYTE(2);
|
||
Data.Depth.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
// --------------------------
|
||
// Stencil Buffer Restriction. Inst Ref: 3DSTATE_STENCIL_BUFFER
|
||
// --------------------------
|
||
Data.Stencil.Alignment = PAGE_SIZE;
|
||
Data.Stencil.PitchAlignment = GMM_BYTES(128);
|
||
Data.Stencil.RenderPitchAlignment = GMM_BYTES(128);
|
||
Data.Stencil.LockPitchAlignment = GMM_BYTES(128);
|
||
Data.Stencil.MinPitch = GMM_BYTES(128);
|
||
Data.Stencil.MaxPitch = GMM_KBYTE(128); // 3DSTATE_STENCIL_BUFFER: 2*Pitch <= 128KB (GMM client allocs 2x-width, so GMM limits to that.)
|
||
Data.Stencil.MinAllocationSize = PAGE_SIZE;
|
||
Data.Stencil.MinHeight = GMM_SCANLINES(1);
|
||
Data.Stencil.MinWidth = GMM_PIXELS(1);
|
||
Data.Stencil.MinDepth = 0;
|
||
Data.Stencil.MaxHeight = GMM_KBYTE(16);
|
||
Data.Stencil.MaxWidth = GMM_KBYTE(16);
|
||
Data.Stencil.MaxDepth = GMM_KBYTE(2);
|
||
Data.Stencil.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
// --------------------------
|
||
// Hierarchical Depth Buffer Restriction. Inst Ref: 3DSTATE_HIER_DEPTH_BUFFER
|
||
// --------------------------
|
||
Data.HiZ.Alignment = PAGE_SIZE;
|
||
Data.HiZ.PitchAlignment = GMM_BYTES(128);
|
||
Data.HiZ.RenderPitchAlignment = GMM_BYTES(128);
|
||
Data.HiZ.LockPitchAlignment = GMM_BYTES(128);
|
||
Data.HiZ.MinPitch = GMM_BYTES(128);
|
||
Data.HiZ.MaxPitch = GMM_KBYTE(128);
|
||
Data.HiZ.MinAllocationSize = PAGE_SIZE;
|
||
Data.HiZ.MinHeight = GMM_SCANLINES(1);
|
||
Data.HiZ.MinWidth = GMM_PIXELS(1);
|
||
Data.HiZ.MinDepth = 0;
|
||
Data.HiZ.MaxHeight = GMM_KBYTE(16);
|
||
Data.HiZ.MaxWidth = GMM_KBYTE(16);
|
||
Data.HiZ.MaxDepth = GMM_KBYTE(2);
|
||
Data.HiZ.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
// --------------------------
|
||
// Vertex Restriction. Inst Ref: 3DSTATE_VERTEX_BUFFER, 3DSTATE_INSTANCE_STEP_RATE
|
||
// Note: restrictions are expanded here for UMD flexibility.
|
||
// --------------------------
|
||
Data.Vertex.Alignment = PAGE_SIZE;
|
||
Data.Vertex.PitchAlignment = GMM_BYTES(1);
|
||
Data.Vertex.LockPitchAlignment = GMM_BYTES(1);
|
||
Data.Vertex.RenderPitchAlignment = GMM_BYTES(1);
|
||
Data.Vertex.MinPitch = GMM_BYTES(1);
|
||
Data.Vertex.MaxPitch = GMM_GBYTE(2);
|
||
Data.Vertex.MinAllocationSize = PAGE_SIZE;
|
||
Data.Vertex.MinHeight = GMM_SCANLINES(1);
|
||
Data.Vertex.MinWidth = GMM_PIXELS(1);
|
||
Data.Vertex.MinDepth = 0;
|
||
Data.Vertex.MaxHeight = GMM_MBYTE(128); //TODO(Minor): How does Media fail when we change this to 1?!
|
||
Data.Vertex.MaxWidth = GMM_GBYTE(2);
|
||
Data.Vertex.MaxDepth = GMM_KBYTE(2);
|
||
Data.Vertex.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
// --------------------------
|
||
// Index Buffer Restriction. Inst Ref: 3DSTATE_INDEX_BUFFER
|
||
// --------------------------
|
||
Data.Index = Data.Vertex;
|
||
|
||
// --------------------------
|
||
// Linear Buffer Restriction. General purpose. Flexible.
|
||
// --------------------------
|
||
Data.Linear.Alignment = PAGE_SIZE;
|
||
Data.Linear.PitchAlignment = GMM_BYTES(1);
|
||
Data.Linear.LockPitchAlignment = GMM_BYTES(1);
|
||
Data.Linear.RenderPitchAlignment = GMM_BYTES(1);
|
||
Data.Linear.MinPitch = GMM_BYTES(1);
|
||
Data.Linear.MaxPitch = GMM_GBYTE(256);
|
||
Data.Linear.MinAllocationSize = PAGE_SIZE;
|
||
Data.Linear.MinHeight = GMM_SCANLINES(1);
|
||
Data.Linear.MinWidth = GMM_PIXELS(1);
|
||
Data.Linear.MinDepth = 0;
|
||
Data.Linear.MaxHeight = 1;
|
||
Data.Linear.MaxWidth = GMM_GBYTE(256);
|
||
Data.Linear.MaxDepth = 1;
|
||
Data.Linear.MaxArraySize = 1;
|
||
|
||
// --------------------------
|
||
// No Surface Restriction. General purpose. Flexible.
|
||
// --------------------------
|
||
Data.NoRestriction.Alignment = PAGE_SIZE;
|
||
Data.NoRestriction.PitchAlignment = GMM_BYTES(1);
|
||
Data.NoRestriction.LockPitchAlignment = GMM_BYTES(1);
|
||
Data.NoRestriction.RenderPitchAlignment = GMM_BYTES(1);
|
||
Data.NoRestriction.MinPitch = GMM_BYTES(1);
|
||
Data.NoRestriction.MaxPitch = GMM_TBYTE(128);
|
||
Data.NoRestriction.MinAllocationSize = PAGE_SIZE;
|
||
Data.NoRestriction.MinHeight = GMM_SCANLINES(1);
|
||
Data.NoRestriction.MinWidth = GMM_PIXELS(1);
|
||
Data.NoRestriction.MinDepth = 0;
|
||
Data.NoRestriction.MaxHeight = GMM_GBYTE(256);
|
||
Data.NoRestriction.MaxWidth = GMM_TBYTE(128);
|
||
Data.NoRestriction.MaxDepth = GMM_KBYTE(2);
|
||
Data.NoRestriction.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
// --------------------------
|
||
// Constant Buffer Restriction.
|
||
// --------------------------
|
||
Data.Constant = Data.NoRestriction;
|
||
|
||
// --------------------------
|
||
// Dx9 Constant Buffer pool Restriction. Inst Ref: 3DSTATE_DX9_CONSTANT_BUFFER_POOL_ALLOC
|
||
// --------------------------
|
||
Data.StateDx9ConstantBuffer = Data.NoRestriction;
|
||
Data.StateDx9ConstantBuffer.Alignment = GMM_KBYTE(8);
|
||
|
||
// --------------------------
|
||
// MC Buffer Restriction
|
||
// --------------------------
|
||
Data.MotionComp = Data.NoRestriction;
|
||
Data.MotionComp.Alignment = PAGE_SIZE;
|
||
Data.MotionComp.PitchAlignment = GMM_BYTES(32);
|
||
Data.MotionComp.LockPitchAlignment = GMM_BYTES(32);
|
||
Data.MotionComp.RenderPitchAlignment = GMM_BYTES(32);
|
||
Data.MotionComp.MinPitch = GMM_BYTES(32);
|
||
|
||
// --------------------------
|
||
// Stream Buffer Restriction
|
||
// --------------------------
|
||
Data.Stream = Data.NoRestriction;
|
||
|
||
// --------------------------
|
||
// Interlace Scan Buffer Restriction
|
||
// --------------------------
|
||
Data.InterlacedScan = Data.NoRestriction;
|
||
|
||
// --------------------------
|
||
// Text API Buffer Restriction
|
||
// --------------------------
|
||
Data.TextApi = Data.NoRestriction;
|
||
|
||
// --------------------------
|
||
// RT & Texture2DSurface restrictions. Inst Ref: SURFACE_STATE
|
||
// Greatest common restriction source comes from 8bpp RT
|
||
// --------------------------
|
||
Data.Texture2DSurface.Alignment = PAGE_SIZE;
|
||
Data.Texture2DSurface.PitchAlignment = GMM_BYTES(32);
|
||
Data.Texture2DSurface.LockPitchAlignment = GMM_BYTES(32);
|
||
Data.Texture2DSurface.RenderPitchAlignment = GMM_BYTES(32);
|
||
Data.Texture2DSurface.MinPitch = GMM_BYTES(32);
|
||
Data.Texture2DSurface.MaxPitch = (pGmmGlobalContext->GetWaTable().WaRestrictPitch128KB) ? GMM_KBYTE(128) : GMM_KBYTE(256);
|
||
Data.Texture2DSurface.MinAllocationSize = PAGE_SIZE;
|
||
Data.Texture2DSurface.MinHeight = GMM_SCANLINES(1);
|
||
Data.Texture2DSurface.MinWidth = GMM_PIXELS(1);
|
||
Data.Texture2DSurface.MinDepth = 0;
|
||
Data.Texture2DSurface.MaxHeight = GMM_KBYTE(16);
|
||
Data.Texture2DSurface.MaxWidth = GMM_KBYTE(16);
|
||
Data.Texture2DSurface.MaxDepth = GMM_FIELD_NA;
|
||
Data.Texture2DSurface.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
{
|
||
// Linear surfaces accessed with Media Block Read/Write commands
|
||
// require 64-byte-aligned pitch. Such commands only operate on 2D
|
||
// resources, so we'll handle the requirement here. Though requirement
|
||
// applies to linear surfaces only, our up'ing the pitch alignment to
|
||
// 64 bytes here won't affect tiled surfaces, since their pitch
|
||
// alignment is never smaller than that.
|
||
Data.Texture2DLinearSurface = Data.Texture2DSurface;
|
||
Data.Texture2DLinearSurface.PitchAlignment = GFX_MAX(GMM_BYTES(64), Data.Texture2DSurface.PitchAlignment);
|
||
Data.Texture2DLinearSurface.LockPitchAlignment = GFX_MAX(GMM_BYTES(64), Data.Texture2DSurface.LockPitchAlignment);
|
||
Data.Texture2DLinearSurface.RenderPitchAlignment = GFX_MAX(GMM_BYTES(64), Data.Texture2DSurface.RenderPitchAlignment);
|
||
}
|
||
|
||
// --------------------------
|
||
// AsyncFlip Restriction. Register Ref: PRI_STRIDE, PRI_SURF, SRCSZ <-- TODO(Minor): SRCSZ correct reg for W/H req's?
|
||
// --------------------------
|
||
Data.ASyncFlipSurface.Alignment = GMM_KBYTE(256);
|
||
Data.ASyncFlipSurface.PitchAlignment = GMM_BYTES(64);
|
||
Data.ASyncFlipSurface.RenderPitchAlignment = GMM_BYTES(64);
|
||
Data.ASyncFlipSurface.LockPitchAlignment = GMM_BYTES(64);
|
||
Data.ASyncFlipSurface.MinPitch = GMM_BYTES(64);
|
||
Data.ASyncFlipSurface.MaxPitch = Data.Texture2DSurface.MaxPitch;
|
||
Data.ASyncFlipSurface.MinAllocationSize = PAGE_SIZE;
|
||
Data.ASyncFlipSurface.MinHeight = GMM_SCANLINES(1);
|
||
Data.ASyncFlipSurface.MinWidth = GMM_PIXELS(1);
|
||
Data.ASyncFlipSurface.MinDepth = 0;
|
||
Data.ASyncFlipSurface.MaxHeight = Data.Texture2DSurface.MaxHeight; // Beyond DE requirements-Necessary for mosaic framebuffers
|
||
Data.ASyncFlipSurface.MaxWidth = Data.Texture2DSurface.MaxWidth; // Okay since GMM isn't actual display requirement gatekeeper.
|
||
Data.ASyncFlipSurface.MaxDepth = 1;
|
||
Data.ASyncFlipSurface.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
// --------------------------
|
||
// Hardware MBM Restriction.
|
||
// --------------------------
|
||
Data.HardwareMBM = Data.ASyncFlipSurface;
|
||
|
||
// --------------------------
|
||
// Video Buffer Restriction
|
||
// --------------------------
|
||
Data.Video = Data.Texture2DLinearSurface;
|
||
|
||
// --------------------------
|
||
// Overlay Buffer Restriction. Overlay buffer restriction will be same as Async flip surface since CNL has universal planes.
|
||
// --------------------------
|
||
Data.Overlay = Data.ASyncFlipSurface;
|
||
|
||
// --------------------------
|
||
// RT & CubeSurface restrictions. Inst Ref: SURFACE_STATE
|
||
// Greatest common restriction source comes from 8bpp RT
|
||
// --------------------------
|
||
Data.CubeSurface.Alignment = PAGE_SIZE;
|
||
Data.CubeSurface.PitchAlignment = GMM_BYTES(32);
|
||
Data.CubeSurface.LockPitchAlignment = GMM_BYTES(32);
|
||
Data.CubeSurface.RenderPitchAlignment = GMM_BYTES(32);
|
||
Data.CubeSurface.MinPitch = GMM_BYTES(32);
|
||
Data.CubeSurface.MaxPitch = (pGmmGlobalContext->GetWaTable().WaRestrictPitch128KB) ? GMM_KBYTE(128) : GMM_KBYTE(256);
|
||
Data.CubeSurface.MinAllocationSize = PAGE_SIZE;
|
||
Data.CubeSurface.MinHeight = GMM_SCANLINES(1);
|
||
Data.CubeSurface.MinWidth = GMM_PIXELS(1);
|
||
Data.CubeSurface.MinDepth = 0;
|
||
Data.CubeSurface.MaxHeight = GMM_KBYTE(16);
|
||
Data.CubeSurface.MaxWidth = GMM_KBYTE(16);
|
||
Data.CubeSurface.MaxDepth = 1;
|
||
Data.CubeSurface.MaxArraySize = GMM_KBYTE(2) / 6; // MaxElements / Cubefaces
|
||
|
||
// --------------------------
|
||
// RT & 3D Surface restrictions. Inst Ref: SURFACE_STATE
|
||
// Greatest common restriction source comes from 8bpp RT
|
||
// --------------------------
|
||
Data.Texture3DSurface.Alignment = PAGE_SIZE;
|
||
Data.Texture3DSurface.PitchAlignment = GMM_BYTES(32);
|
||
Data.Texture3DSurface.LockPitchAlignment = GMM_BYTES(32);
|
||
Data.Texture3DSurface.RenderPitchAlignment = GMM_BYTES(32);
|
||
Data.Texture3DSurface.MinPitch = GMM_BYTES(32);
|
||
Data.Texture3DSurface.MaxPitch = (pGmmGlobalContext->GetWaTable().WaRestrictPitch128KB) ? GMM_KBYTE(128) : GMM_KBYTE(256);
|
||
Data.Texture3DSurface.MinAllocationSize = PAGE_SIZE;
|
||
Data.Texture3DSurface.MinHeight = GMM_SCANLINES(1);
|
||
Data.Texture3DSurface.MinWidth = GMM_PIXELS(1);
|
||
Data.Texture3DSurface.MinDepth = 0;
|
||
Data.Texture3DSurface.MaxHeight = GMM_KBYTE(16);
|
||
Data.Texture3DSurface.MaxWidth = GMM_KBYTE(16);
|
||
Data.Texture3DSurface.MaxDepth = GMM_KBYTE(2);
|
||
Data.Texture3DSurface.MaxArraySize = GMM_FIELD_NA;
|
||
|
||
// --------------------------
|
||
// RT & Buffer Type restrictions. Inst Ref: SURFACE_STATE
|
||
// Greatest common restriction source comes from 8bpp RT
|
||
// --------------------------
|
||
Data.BufferType.Alignment = PAGE_SIZE;
|
||
Data.BufferType.PitchAlignment = GMM_BYTES(32);
|
||
Data.BufferType.LockPitchAlignment = GMM_BYTES(32);
|
||
Data.BufferType.RenderPitchAlignment = GMM_BYTES(32);
|
||
Data.BufferType.MinPitch = GMM_BYTES(32);
|
||
Data.BufferType.MaxPitch = GMM_GBYTE(256);
|
||
Data.BufferType.MinAllocationSize = PAGE_SIZE;
|
||
Data.BufferType.MinHeight = GMM_SCANLINES(0);
|
||
Data.BufferType.MinWidth = GMM_PIXELS(1);
|
||
Data.BufferType.MinDepth = 0;
|
||
Data.BufferType.MaxHeight = GMM_SCANLINES(1);
|
||
Data.BufferType.MaxWidth = GMM_GBYTE(256);
|
||
Data.BufferType.MaxDepth = GMM_FIELD_NA;
|
||
Data.BufferType.MaxArraySize = GMM_GBYTE(2);
|
||
|
||
// --------------------------
|
||
// Cursor surface restricion. Register Ref: CURACNTR, CURABASE
|
||
// --------------------------
|
||
Data.Cursor.Alignment = pGmmGlobalContext->GetWaTable().WaCursor16K ? GMM_KBYTE(16) : PAGE_SIZE;
|
||
Data.Cursor.PitchAlignment = 1;
|
||
Data.Cursor.LockPitchAlignment = 1;
|
||
Data.Cursor.RenderPitchAlignment = 1;
|
||
Data.Cursor.MinPitch = 1;
|
||
Data.Cursor.MaxPitch = 0xffffffff;
|
||
Data.Cursor.MinAllocationSize = 1;
|
||
Data.Cursor.MinHeight = GMM_SCANLINES(1);
|
||
Data.Cursor.MinWidth = 1;
|
||
Data.Cursor.MinDepth = 0;
|
||
Data.Cursor.MaxHeight = 0xffffffff;
|
||
Data.Cursor.MaxWidth = 0xffffffff;
|
||
Data.Cursor.MaxDepth = 0xffffffff;
|
||
Data.Cursor.MaxArraySize = 1;
|
||
|
||
// clang-format off
|
||
/******************************************************************************************************/
|
||
/*************************************** Width, Height, Depth, MtsWidth, MtsHeight, MtsDepth */
|
||
/******************************************************************************************************/
|
||
// Legacy TILE_X/Y
|
||
SET_TILE_MODE_INFO(LEGACY_TILE_X, 512, 8, 1, 0, 0, 0)
|
||
SET_TILE_MODE_INFO(LEGACY_TILE_Y, 128, 32, 1, 0, 0, 0)
|
||
// YS 1D
|
||
SET_TILE_MODE_INFO(TILE_YS_1D_128bpe, 4096, 1, 1, 1024, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_1D_64bpe, 8192, 1, 1, 2048, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_1D_32bpe, 16384, 1, 1, 4096, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_1D_16bpe, 32768, 1, 1, 8192, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_1D_8bpe, 65536, 1, 1, 16384, 1, 1)
|
||
// YS 2D
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_128bpe, 1024, 64, 1, 32, 64, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_64bpe, 1024, 64, 1, 64, 64, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_32bpe, 512, 128, 1, 64, 128, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_16bpe, 512, 128, 1, 128, 128, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_8bpe, 256, 256, 1, 128, 256, 1)
|
||
// YS 2D 2X
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_2X_128bpe, 512, 64, 1, 32, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_2X_64bpe, 512, 64, 1, 64, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_2X_32bpe, 256, 128, 1, 64, 64, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_2X_16bpe, 256, 128, 1, 128, 64, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_2X_8bpe, 128, 256, 1, 128, 128, 1)
|
||
// YS 2D 4X
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_4X_128bpe, 512, 32, 1, 16, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_4X_64bpe, 512, 32, 1, 32, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_4X_32bpe, 256, 64, 1, 32, 64, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_4X_16bpe, 256, 64, 1, 64, 64, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_4X_8bpe, 128, 128, 1, 64, 128, 1)
|
||
// YS 2D 8X
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_8X_128bpe, 256, 32, 1, 16, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_8X_64bpe, 256, 32, 1, 32, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_8X_32bpe, 128, 64, 1, 32, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_8X_16bpe, 128, 64, 1, 64, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_8X_8bpe, 64, 128, 1, 64, 64, 1)
|
||
// YS 2D 16X
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_16X_128bpe, 256, 16, 1, 8, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_16X_64bpe, 256, 16, 1, 16, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_16X_32bpe, 128, 32, 1, 16, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_16X_16bpe, 128, 32, 1, 32, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YS_2D_16X_8bpe, 64, 64, 1, 32, 64, 1)
|
||
// YS 3D
|
||
SET_TILE_MODE_INFO(TILE_YS_3D_128bpe, 256, 16, 16, 8, 16, 16)
|
||
SET_TILE_MODE_INFO(TILE_YS_3D_64bpe, 256, 16, 16, 16, 16, 16)
|
||
SET_TILE_MODE_INFO(TILE_YS_3D_32bpe, 128, 32, 16, 16, 32, 16)
|
||
SET_TILE_MODE_INFO(TILE_YS_3D_16bpe, 64, 32, 32, 16, 32, 32)
|
||
SET_TILE_MODE_INFO(TILE_YS_3D_8bpe, 64, 32, 32, 32, 32, 32)
|
||
// YF 1D
|
||
SET_TILE_MODE_INFO(TILE_YF_1D_128bpe, 256, 1, 1, 64, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_1D_64bpe, 512, 1, 1, 128, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_1D_32bpe, 1024, 1, 1, 256, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_1D_16bpe, 2048, 1, 1, 512, 1, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_1D_8bpe, 4096, 1, 1, 1024, 1, 1)
|
||
// YF 2D
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_128bpe, 256, 16, 1, 8, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_64bpe, 256, 16, 1, 16, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_32bpe, 128, 32, 1, 16, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_16bpe, 128, 32, 1, 32, 32, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_8bpe, 64, 64, 1, 32, 64, 1)
|
||
// YF 2D 2X
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_2X_128bpe, 128, 16, 1, 4, 8, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_2X_64bpe, 128, 16, 1, 8, 8, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_2X_32bpe, 64, 32, 1, 8, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_2X_16bpe, 64, 32, 1, 16, 16, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_2X_8bpe, 32, 64, 1, 16, 32, 1)
|
||
// YF 2D 4X
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_4X_128bpe, 128, 8, 1, 4, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_4X_64bpe, 128, 8, 1, 8, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_4X_32bpe, 64, 16, 1, 8, 8, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_4X_16bpe, 64, 16, 1, 16, 8, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_4X_8bpe, 32, 32, 1, 16, 16, 1)
|
||
// YF 2D 8X
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_8X_128bpe, 64, 8, 1, 4, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_8X_64bpe, 64, 8, 1, 8, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_8X_32bpe, 32, 16, 1, 8, 8, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_8X_16bpe, 32, 16, 1, 16, 8, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_8X_8bpe, 16, 32, 1, 16, 16, 1)
|
||
// YF 2D 16X
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_16X_128bpe, 64, 4, 1, 1, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_16X_64bpe, 64, 4, 1, 2, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_16X_32bpe, 32, 8, 1, 4, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_16X_16bpe, 32, 8, 1, 8, 4, 1)
|
||
SET_TILE_MODE_INFO(TILE_YF_2D_16X_8bpe, 16, 16, 1, 8, 4, 1)
|
||
// YF 3D
|
||
SET_TILE_MODE_INFO(TILE_YF_3D_128bpe, 64, 8, 8, 4, 4, 8)
|
||
SET_TILE_MODE_INFO(TILE_YF_3D_64bpe, 64, 8, 8, 8, 4, 8)
|
||
SET_TILE_MODE_INFO(TILE_YF_3D_32bpe, 32, 16, 8, 8, 8, 8)
|
||
SET_TILE_MODE_INFO(TILE_YF_3D_16bpe, 16, 16, 16, 8, 8, 16)
|
||
SET_TILE_MODE_INFO(TILE_YF_3D_8bpe, 16, 16, 16, 16, 8, 16)
|
||
// clang-format on
|
||
|
||
//--------------------------
|
||
// Fence paramaters. Register Ref: FENCE
|
||
//--------------------------
|
||
Data.NumberFenceRegisters = pGmmGlobalContext->GetWaTable().Wa16TileFencesOnly ? 16 : 32;
|
||
Data.FenceLowBoundShift = 12;
|
||
Data.FenceLowBoundMask = GFX_MASK(12, 31);
|
||
Data.MinFenceSize = GMM_MBYTE(1);
|
||
|
||
Data.PagingBufferPrivateDataSize = GMM_KBYTE(4);
|
||
Data.MaxLod = 14; // [0,14] --> 15 Total
|
||
|
||
Data.FBCRequiredStolenMemorySize = GMM_MBYTE(8);
|
||
|
||
// --------------------------
|
||
// Surface Alignment Units
|
||
// --------------------------
|
||
Data.TexAlign.CCS.Align.Width = 128;
|
||
Data.TexAlign.CCS.Align.Height = 64;
|
||
Data.TexAlign.CCS.MaxPitchinTiles = 512;
|
||
Data.TexAlign.Compressed.Width = 4; // No reason for > HALIGN_4.
|
||
Data.TexAlign.Compressed.Height = 4; // No reason for > VALIGN_4.
|
||
Data.TexAlign.Compressed.Depth = 4; // No reason for > DALIGN_4.
|
||
Data.TexAlign.Depth.Width = 4; // See usage for 16bpp HALIGN_8 special-casing.
|
||
Data.TexAlign.Depth.Height = 4;
|
||
Data.TexAlign.Depth_D16_UNORM_1x_4x_16x.Width = 8;
|
||
Data.TexAlign.Depth_D16_UNORM_1x_4x_16x.Height = Data.TexAlign.Depth.Height;
|
||
Data.TexAlign.Depth_D16_UNORM_2x_8x.Width = 8;
|
||
Data.TexAlign.Depth_D16_UNORM_2x_8x.Height = Data.TexAlign.Depth.Height;
|
||
Data.TexAlign.SeparateStencil.Width = 8;
|
||
Data.TexAlign.SeparateStencil.Height = 8;
|
||
Data.TexAlign.YUV422.Width = 4;
|
||
Data.TexAlign.YUV422.Height = 4;
|
||
Data.TexAlign.AllOther.Width = 16; // HALIGN_16 required for non-MSAA RT's for CCS Fast-Clear and...TBA
|
||
Data.TexAlign.AllOther.Height = 4; // VALIGN_4 should be sufficent.
|
||
Data.TexAlign.XAdapter.Height = D3DKMT_CROSS_ADAPTER_RESOURCE_HEIGHT_ALIGNMENT;
|
||
Data.TexAlign.XAdapter.Width = 1; //minimum should be one.
|
||
|
||
// ----------------------------------
|
||
// SURFACE_STATE YOffset Granularity
|
||
// ----------------------------------
|
||
Data.SurfaceStateYOffsetGranularity = 4;
|
||
Data.SamplerFetchGranularityHeight = 4;
|
||
Data.SamplerFetchGranularityWidth = 4;
|
||
|
||
// ----------------------------------
|
||
// Restrictions for Cross adapter resource
|
||
// ----------------------------------
|
||
Data.XAdapter.Alignment = GMM_KBYTE(64); //64KB for DX12/StdSwizzle<6C>-Not worth special-casing.
|
||
Data.XAdapter.PitchAlignment = GMM_BYTES(D3DKMT_CROSS_ADAPTER_RESOURCE_PITCH_ALIGNMENT);
|
||
Data.XAdapter.RenderPitchAlignment = GMM_BYTES(D3DKMT_CROSS_ADAPTER_RESOURCE_PITCH_ALIGNMENT);
|
||
Data.XAdapter.LockPitchAlignment = GMM_BYTES(D3DKMT_CROSS_ADAPTER_RESOURCE_PITCH_ALIGNMENT);
|
||
Data.XAdapter.MinPitch = GMM_BYTES(32);
|
||
Data.XAdapter.MaxPitch = (pGmmGlobalContext->GetWaTable().WaRestrictPitch128KB) ? GMM_KBYTE(128) : GMM_KBYTE(256);
|
||
Data.XAdapter.MinAllocationSize = PAGE_SIZE;
|
||
Data.XAdapter.MinHeight = GMM_SCANLINES(1);
|
||
Data.XAdapter.MinWidth = GMM_PIXELS(1);
|
||
Data.XAdapter.MinDepth = 0;
|
||
Data.XAdapter.MaxHeight = GMM_KBYTE(16);
|
||
Data.XAdapter.MaxWidth = GMM_KBYTE(16);
|
||
Data.XAdapter.MaxDepth = GMM_FIELD_NA;
|
||
Data.XAdapter.MaxArraySize = GMM_KBYTE(2);
|
||
|
||
//---------------------------------------------
|
||
//MaxSize for any surface type
|
||
//---------------------------------------------
|
||
Data.SurfaceMaxSize = GMM_GBYTE(256);
|
||
Data.MaxGpuVirtualAddressBitsPerResource = 38;
|
||
Data.HiZPixelsPerByte = 2;
|
||
|
||
Data.ReconMaxHeight = Data.Texture2DSurface.MaxHeight; // Reconstructed surfaces require more height and width for higher resolutions.
|
||
Data.ReconMaxWidth = Data.Texture2DSurface.MaxWidth;
|
||
|
||
Data.NoOfBitsSupported = 39;
|
||
Data.HighestAcceptablePhysicalAddress = GFX_MASK_LARGE(0, 38);
|
||
}
|