| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559 |
- // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #pragma once
- #include <array>
- #include <bitset>
- #include <cmath>
- #include <limits>
- #include <optional>
- #include <type_traits>
- #include <vector>
- #include "common/assert.h"
- #include "common/bit_field.h"
- #include "common/common_funcs.h"
- #include "common/common_types.h"
- #include "common/math_util.h"
- #include "video_core/engines/const_buffer_info.h"
- #include "video_core/engines/engine_interface.h"
- #include "video_core/engines/engine_upload.h"
- #include "video_core/gpu.h"
- #include "video_core/macro/macro.h"
- #include "video_core/textures/texture.h"
- namespace Core {
- class System;
- }
- namespace Tegra {
- class MemoryManager;
- }
- namespace VideoCore {
- class RasterizerInterface;
- }
- namespace Tegra::Engines {
- class DrawManager;
- /**
- * This Engine is known as GF100_3D. Documentation can be found in:
- * https://github.com/NVIDIA/open-gpu-doc/blob/master/classes/3d/clb197.h
- * https://github.com/envytools/envytools/blob/master/rnndb/graph/gf100_3d.xml
- * https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/nouveau/nvc0/nvc0_3d.xml.h
- *
- * Note: nVidia have confirmed that their open docs have had parts redacted, so this list is
- * currently incomplete, and the gaps are still worth exploring.
- */
- #define MAXWELL3D_REG_INDEX(field_name) (offsetof(Maxwell3D::Regs, field_name) / sizeof(u32))
- class Maxwell3D final : public EngineInterface {
- public:
- explicit Maxwell3D(Core::System& system, MemoryManager& memory_manager);
- ~Maxwell3D();
- /// Binds a rasterizer to this engine.
- void BindRasterizer(VideoCore::RasterizerInterface* rasterizer);
- /// Register structure of the Maxwell3D engine.
- struct Regs {
- static constexpr std::size_t NUM_REGS = 0xE00;
- static constexpr std::size_t NumRenderTargets = 8;
- static constexpr std::size_t NumViewports = 16;
- static constexpr std::size_t NumCBData = 16;
- static constexpr std::size_t NumVertexArrays = 32;
- static constexpr std::size_t NumVertexAttributes = 32;
- static constexpr std::size_t NumVaryings = 31;
- static constexpr std::size_t NumImages = 8; // TODO(Rodrigo): Investigate this number
- static constexpr std::size_t NumClipDistances = 8;
- static constexpr std::size_t NumTransformFeedbackBuffers = 4;
- static constexpr std::size_t MaxShaderProgram = 6;
- static constexpr std::size_t MaxShaderStage = 5;
- // Maximum number of const buffers per shader stage.
- static constexpr std::size_t MaxConstBuffers = 18;
- static constexpr std::size_t MaxConstBufferSize = 0x10000;
- struct ID {
- union {
- BitField<0, 16, u32> cls;
- BitField<16, 5, u32> engine;
- };
- };
- struct LoadMME {
- u32 instruction_ptr;
- u32 instruction;
- u32 start_address_ptr;
- u32 start_address;
- };
- struct Notify {
- u32 address_high;
- u32 address_low;
- u32 type;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct PeerSemaphore {
- u32 address_high;
- u32 address_low;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct GlobalRender {
- enum class Mode : u32 {
- False = 0,
- True = 1,
- Conditional = 2,
- IfEqual = 3,
- IfNotEqual = 4,
- };
- u32 offset_high;
- u32 offset_low;
- Mode mode;
- GPUVAddr Address() const {
- return (GPUVAddr{offset_high} << 32) | GPUVAddr{offset_low};
- }
- };
- enum class ReductionOp : u32 {
- RedAdd = 0,
- RedMin = 1,
- RedMax = 2,
- RedInc = 3,
- RedDec = 4,
- RedAnd = 5,
- RedOr = 6,
- RedXor = 7,
- };
- struct LaunchDMA {
- enum class Layout : u32 {
- Blocklinear = 0,
- Pitch = 1,
- };
- enum class CompletionType : u32 {
- FlushDisable = 0,
- FlushOnly = 1,
- Release = 2,
- };
- union {
- BitField<0, 1, Layout> memory_layout;
- BitField<4, 2, CompletionType> completion_type;
- BitField<8, 2, u32> interrupt_type;
- BitField<12, 1, u32> sem_size;
- BitField<1, 1, u32> reduction_enable;
- BitField<13, 3, ReductionOp> reduction_op;
- BitField<2, 2, u32> reduction_format;
- BitField<6, 1, u32> sysmembar_disable;
- };
- };
- struct I2M {
- u32 address_high;
- u32 address_low;
- u32 payload;
- INSERT_PADDING_BYTES_NOINIT(0x8);
- u32 nop0;
- u32 nop1;
- u32 nop2;
- u32 nop3;
- };
- struct OpportunisticEarlyZ {
- BitField<0, 5, u32> threshold;
- u32 Threshold() const {
- switch (threshold) {
- case 0x0:
- return 0;
- case 0x1F:
- return 0x1F;
- default:
- // Thresholds begin at 0x10 (1 << 4)
- // Threshold is in the range 0x1 to 0x13
- return 1U << (4 + threshold.Value() - 1);
- }
- }
- };
- struct GeometryShaderDmFifo {
- union {
- BitField<0, 13, u32> raster_on;
- BitField<16, 13, u32> raster_off;
- BitField<31, 1, u32> spill_enabled;
- };
- };
- struct L2CacheControl {
- enum class EvictPolicy : u32 {
- First = 0,
- Normal = 1,
- Last = 2,
- };
- union {
- BitField<4, 2, EvictPolicy> policy;
- };
- };
- struct InvalidateShaderCache {
- union {
- BitField<0, 1, u32> instruction;
- BitField<4, 1, u32> data;
- BitField<12, 1, u32> constant;
- BitField<1, 1, u32> locks;
- BitField<2, 1, u32> flush_data;
- };
- };
- struct SyncInfo {
- enum class Condition : u32 {
- StreamOutWritesDone = 0,
- RopWritesDone = 1,
- };
- union {
- BitField<0, 16, u32> sync_point;
- BitField<16, 1, u32> clean_l2;
- BitField<20, 1, Condition> condition;
- };
- };
- struct SurfaceClipBlockId {
- union {
- BitField<0, 4, u32> block_width;
- BitField<4, 4, u32> block_height;
- BitField<8, 4, u32> block_depth;
- };
- };
- struct DecompressSurface {
- union {
- BitField<0, 3, u32> mrt_select;
- BitField<4, 16, u32> rt_array_index;
- };
- };
- struct ZCullRopBypass {
- union {
- BitField<0, 1, u32> enable;
- BitField<4, 1, u32> no_stall;
- BitField<8, 1, u32> cull_everything;
- BitField<12, 4, u32> threshold;
- };
- };
- struct ZCullSubregion {
- union {
- BitField<0, 1, u32> enable;
- BitField<4, 24, u32> normalized_aliquots;
- };
- };
- struct RasterBoundingBox {
- enum class Mode : u32 {
- BoundingBox = 0,
- FullViewport = 1,
- };
- union {
- u32 raw;
- BitField<0, 1, Mode> mode;
- BitField<4, 8, u32> pad;
- };
- };
- struct IteratedBlendOptimization {
- enum class Noop : u32 {
- Never = 0,
- SourceRGBA0000 = 1,
- SourceAlpha = 2,
- SourceRGBA0001 = 3,
- };
- union {
- BitField<0, 1, Noop> noop;
- };
- };
- struct ZCullSubregionAllocation {
- enum class Format : u32 {
- Z_16x16x2_4x4 = 0,
- ZS_16x16_4x4 = 1,
- Z_16x16_4x2 = 2,
- Z_16x16_2x4 = 3,
- Z_16x8_4x4 = 4,
- Z_8x8_4x2 = 5,
- Z_8x8_2x4 = 6,
- Z_16x16_4x8 = 7,
- Z_4x8_2x2 = 8,
- ZS_16x8_4x2 = 9,
- ZS_16x8_2x4 = 10,
- ZS_8x8_2x2 = 11,
- Z_4x8_1x1 = 12,
- None = 15,
- };
- union {
- BitField<0, 8, u32> id;
- BitField<8, 16, u32> aliquots;
- BitField<24, 4, Format> format;
- };
- };
- enum class ZCullSubregionAlgorithm : u32 {
- Static = 0,
- Adaptive = 1,
- };
- struct PixelShaderOutputSampleMaskUsage {
- union {
- BitField<0, 1, u32> enable;
- BitField<1, 1, u32> qualify_by_aa;
- };
- };
- struct L1Configuration {
- enum class AddressableMemory : u32 {
- Size16Kb = 0,
- Size48Kb = 3,
- };
- union {
- BitField<0, 3, AddressableMemory> direct_addressable_memory;
- };
- };
- struct SPAVersion {
- union {
- BitField<0, 8, u32> minor;
- BitField<8, 8, u32> major;
- };
- };
- struct SnapGrid {
- enum class Location : u32 {
- Pixel2x2 = 1,
- Pixel4x4 = 2,
- Pixel8x8 = 3,
- Pixel16x16 = 4,
- Pixel32x32 = 5,
- Pixel64x64 = 6,
- Pixel128x128 = 7,
- Pixel256x256 = 8,
- };
- enum class Mode : u32 {
- RTNE = 0,
- Tesla = 1,
- };
- struct {
- union {
- BitField<0, 4, Location> location;
- BitField<8, 1, Mode> rounding_mode;
- };
- } line;
- struct {
- union {
- BitField<0, 4, Location> location;
- BitField<8, 1, Mode> rounding_mode;
- };
- } non_line;
- };
- struct Tessellation {
- enum class DomainType : u32 {
- Isolines = 0,
- Triangles = 1,
- Quads = 2,
- };
- enum class Spacing : u32 {
- Integer = 0,
- FractionalOdd = 1,
- FractionalEven = 2,
- };
- enum class OutputPrimitives : u32 {
- Points = 0,
- Lines = 1,
- Triangles_CW = 2,
- Triangles_CCW = 3,
- };
- struct Parameters {
- union {
- BitField<0, 2, DomainType> domain_type;
- BitField<4, 2, Spacing> spacing;
- BitField<8, 2, OutputPrimitives> output_primitives;
- };
- } params;
- struct LOD {
- std::array<f32, 4> outer;
- std::array<f32, 2> inner;
- } lod;
- std::array<u32, 9> reserved;
- };
- struct SubTilingPerf {
- struct {
- union {
- BitField<0, 8, u32> spm_triangle_register_file_per;
- BitField<8, 8, u32> spm_pixel_output_buffer_per;
- BitField<16, 8, u32> spm_triangle_ram_per;
- BitField<24, 8, u32> max_quads_per;
- };
- } knob_a;
- struct {
- union {
- BitField<0, 8, u32> max_primitives_per;
- };
- } knob_b;
- u32 knob_c;
- };
- struct ZCullSubregionReport {
- enum class ReportType : u32 {
- DepthTest = 0,
- DepthTestNoAccept = 1,
- DepthTestLateZ = 2,
- StencilTest = 3,
- };
- union {
- BitField<0, 1, u32> enabled;
- BitField<4, 8, u32> subregion_id;
- } to_report;
- union {
- BitField<0, 1, u32> enabled;
- BitField<4, 3, ReportType> type;
- } report_type;
- };
- struct BalancedPrimitiveWorkload {
- union {
- BitField<0, 1, u32> unpartitioned_mode;
- BitField<4, 1, u32> timesliced_mode;
- };
- };
- struct TransformFeedback {
- struct Buffer {
- u32 enable;
- u32 address_high;
- u32 address_low;
- s32 size;
- s32 start_offset;
- INSERT_PADDING_BYTES_NOINIT(0xC);
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- static_assert(sizeof(Buffer) == 0x20);
- struct Control {
- u32 stream;
- u32 varying_count;
- u32 stride;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- };
- static_assert(sizeof(Control) == 0x10);
- std::array<TransformFeedback::Buffer, NumTransformFeedbackBuffers> buffers;
- INSERT_PADDING_BYTES_NOINIT(0x300);
- std::array<TransformFeedback::Control, NumTransformFeedbackBuffers> controls;
- };
- struct HybridAntiAliasControl {
- enum class Centroid : u32 {
- PerFragment = 0,
- PerPass = 1,
- };
- union {
- BitField<0, 4, u32> passes;
- BitField<4, 1, Centroid> centroid;
- BitField<5, 1, u32> passes_extended;
- };
- };
- struct ShaderLocalMemory {
- u32 base_address;
- INSERT_PADDING_BYTES_NOINIT(0x10);
- u32 address_high;
- u32 address_low;
- u32 size_high;
- u32 size_low;
- u32 default_size_per_warp;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- u64 Size() const {
- return (u64{size_high} << 32) | u64{size_low};
- }
- };
- struct ZCullRegion {
- u32 width;
- u32 height;
- u32 depth;
- u32 offset;
- INSERT_PADDING_BYTES_NOINIT(0xC);
- u32 fetch_streams_once;
- union {
- BitField<0, 16, u32> start_aliquot;
- BitField<16, 16, u32> aliquot_count;
- } location;
- u32 aliquots_per_layer;
- u32 storage_address_high;
- u32 storage_address_low;
- u32 storage_limit_address_high;
- u32 storage_limit_address_low;
- GPUVAddr StorageAddress() const {
- return (GPUVAddr{storage_address_high} << 32) | GPUVAddr{storage_address_low};
- }
- GPUVAddr StorageLimitAddress() const {
- return (GPUVAddr{storage_limit_address_high} << 32) |
- GPUVAddr{storage_limit_address_low};
- }
- };
- struct ZetaReadOnly {
- union {
- BitField<0, 1, u32> enable_z;
- BitField<4, 1, u32> enable_stencil;
- };
- };
- struct VertexAttribute {
- enum class Size : u32 {
- Invalid = 0x0,
- Size_R32_G32_B32_A32 = 0x01,
- Size_R32_G32_B32 = 0x02,
- Size_R16_G16_B16_A16 = 0x03,
- Size_R32_G32 = 0x04,
- Size_R16_G16_B16 = 0x05,
- Size_R8_G8_B8_A8 = 0x0A,
- Size_R16_G16 = 0x0F,
- Size_R32 = 0x12,
- Size_R8_G8_B8 = 0x13,
- Size_R8_G8 = 0x18,
- Size_R16 = 0x1B,
- Size_R8 = 0x1D,
- Size_A2_B10_G10_R10 = 0x30,
- Size_B10_G11_R11 = 0x31,
- Size_G8_R8 = 0x32,
- Size_X8_B8_G8_R8 = 0x33,
- Size_A8 = 0x34,
- };
- enum class Type : u32 {
- UnusedEnumDoNotUseBecauseItWillGoAway = 0,
- SNorm = 1,
- UNorm = 2,
- SInt = 3,
- UInt = 4,
- UScaled = 5,
- SScaled = 6,
- Float = 7,
- };
- union {
- BitField<0, 5, u32> buffer;
- BitField<6, 1, u32> constant;
- BitField<7, 14, u32> offset;
- BitField<21, 6, Size> size;
- BitField<27, 3, Type> type;
- BitField<31, 1, u32> bgra;
- u32 hex;
- };
- u32 ComponentCount() const {
- switch (size) {
- case Size::Size_R32_G32_B32_A32:
- return 4;
- case Size::Size_R32_G32_B32:
- return 3;
- case Size::Size_R16_G16_B16_A16:
- return 4;
- case Size::Size_R32_G32:
- return 2;
- case Size::Size_R16_G16_B16:
- return 3;
- case Size::Size_R8_G8_B8_A8:
- case Size::Size_X8_B8_G8_R8:
- return 4;
- case Size::Size_R16_G16:
- return 2;
- case Size::Size_R32:
- return 1;
- case Size::Size_R8_G8_B8:
- return 3;
- case Size::Size_R8_G8:
- case Size::Size_G8_R8:
- return 2;
- case Size::Size_R16:
- return 1;
- case Size::Size_R8:
- case Size::Size_A8:
- return 1;
- case Size::Size_A2_B10_G10_R10:
- return 4;
- case Size::Size_B10_G11_R11:
- return 3;
- default:
- ASSERT(false);
- return 1;
- }
- }
- u32 SizeInBytes() const {
- switch (size) {
- case Size::Size_R32_G32_B32_A32:
- return 16;
- case Size::Size_R32_G32_B32:
- return 12;
- case Size::Size_R16_G16_B16_A16:
- return 8;
- case Size::Size_R32_G32:
- return 8;
- case Size::Size_R16_G16_B16:
- return 6;
- case Size::Size_R8_G8_B8_A8:
- case Size::Size_X8_B8_G8_R8:
- return 4;
- case Size::Size_R16_G16:
- return 4;
- case Size::Size_R32:
- return 4;
- case Size::Size_R8_G8_B8:
- return 3;
- case Size::Size_R8_G8:
- case Size::Size_G8_R8:
- return 2;
- case Size::Size_R16:
- return 2;
- case Size::Size_R8:
- case Size::Size_A8:
- return 1;
- case Size::Size_A2_B10_G10_R10:
- return 4;
- case Size::Size_B10_G11_R11:
- return 4;
- default:
- ASSERT(false);
- return 1;
- }
- }
- std::string SizeString() const {
- switch (size) {
- case Size::Size_R32_G32_B32_A32:
- return "32_32_32_32";
- case Size::Size_R32_G32_B32:
- return "32_32_32";
- case Size::Size_R16_G16_B16_A16:
- return "16_16_16_16";
- case Size::Size_R32_G32:
- return "32_32";
- case Size::Size_R16_G16_B16:
- return "16_16_16";
- case Size::Size_R8_G8_B8_A8:
- return "8_8_8_8";
- case Size::Size_R16_G16:
- return "16_16";
- case Size::Size_R32:
- return "32";
- case Size::Size_R8_G8_B8:
- return "8_8_8";
- case Size::Size_R8_G8:
- case Size::Size_G8_R8:
- return "8_8";
- case Size::Size_R16:
- return "16";
- case Size::Size_R8:
- case Size::Size_A8:
- return "8";
- case Size::Size_A2_B10_G10_R10:
- return "2_10_10_10";
- case Size::Size_B10_G11_R11:
- return "10_11_11";
- default:
- ASSERT(false);
- return {};
- }
- }
- std::string TypeString() const {
- switch (type) {
- case Type::UnusedEnumDoNotUseBecauseItWillGoAway:
- return "Unused";
- case Type::SNorm:
- return "SNORM";
- case Type::UNorm:
- return "UNORM";
- case Type::SInt:
- return "SINT";
- case Type::UInt:
- return "UINT";
- case Type::UScaled:
- return "USCALED";
- case Type::SScaled:
- return "SSCALED";
- case Type::Float:
- return "FLOAT";
- }
- ASSERT(false);
- return {};
- }
- bool IsNormalized() const {
- return (type == Type::SNorm) || (type == Type::UNorm);
- }
- bool IsValid() const {
- return size != Size::Invalid;
- }
- bool operator<(const VertexAttribute& other) const {
- return hex < other.hex;
- }
- };
- static_assert(sizeof(VertexAttribute) == 0x4);
- struct MsaaSampleLocation {
- union {
- BitField<0, 4, u32> x0;
- BitField<4, 4, u32> y0;
- BitField<8, 4, u32> x1;
- BitField<12, 4, u32> y1;
- BitField<16, 4, u32> x2;
- BitField<20, 4, u32> y2;
- BitField<24, 4, u32> x3;
- BitField<28, 4, u32> y3;
- };
- constexpr std::pair<u32, u32> Location(int index) const {
- switch (index) {
- case 0:
- return {x0, y0};
- case 1:
- return {x1, y1};
- case 2:
- return {x2, y2};
- case 3:
- return {x3, y3};
- default:
- ASSERT(false);
- return {0, 0};
- }
- }
- };
- struct MultisampleCoverageToColor {
- union {
- BitField<0, 1, u32> enable;
- BitField<4, 3, u32> target;
- };
- };
- struct DecompressZetaSurface {
- union {
- BitField<0, 1, u32> z_enable;
- BitField<4, 1, u32> stencil_enable;
- };
- };
- struct ZetaSparse {
- enum class UnmappedCompare : u32 {
- Unmapped = 0,
- FailAlways = 1,
- };
- union {
- BitField<0, 1, u32> enable;
- BitField<1, 1, UnmappedCompare> unmapped_compare;
- };
- };
- struct RtControl {
- union {
- BitField<0, 4, u32> count;
- BitField<4, 3, u32> target0;
- BitField<7, 3, u32> target1;
- BitField<10, 3, u32> target2;
- BitField<13, 3, u32> target3;
- BitField<16, 3, u32> target4;
- BitField<19, 3, u32> target5;
- BitField<22, 3, u32> target6;
- BitField<25, 3, u32> target7;
- };
- u32 Map(std::size_t index) const {
- const std::array<u32, NumRenderTargets> maps{target0, target1, target2, target3,
- target4, target5, target6, target7};
- ASSERT(index < maps.size());
- return maps[index];
- }
- };
- struct CompressionThresholdSamples {
- u32 samples;
- u32 Samples() const {
- if (samples == 0) {
- return 0;
- }
- return 1U << (samples - 1);
- }
- };
- struct PixelShaderInterlockControl {
- enum class TileMode : u32 {
- NoConflictDetect = 0,
- DetectSampleConflict = 1,
- DetectPixelConflict = 2,
- };
- enum class TileSize : u32 {
- Size_16x16 = 0,
- Size_8x8 = 1,
- };
- enum class FragmentOrder : u32 {
- FragmentOrdered = 0,
- FragmentUnordered = 1,
- };
- union {
- BitField<0, 2, TileMode> tile_mode;
- BitField<2, 1, TileSize> tile_size;
- BitField<3, 1, FragmentOrder> fragment_order;
- };
- };
- struct ZetaSize {
- enum class DimensionControl : u32 {
- DepthDefinesArray = 0,
- ArraySizeOne = 1,
- };
- u32 width;
- u32 height;
- union {
- BitField<0, 16, u32> depth;
- BitField<16, 1, DimensionControl> dim_control;
- };
- };
- enum class PrimitiveTopology : u32 {
- Points = 0x0,
- Lines = 0x1,
- LineLoop = 0x2,
- LineStrip = 0x3,
- Triangles = 0x4,
- TriangleStrip = 0x5,
- TriangleFan = 0x6,
- Quads = 0x7,
- QuadStrip = 0x8,
- Polygon = 0x9,
- LinesAdjacency = 0xA,
- LineStripAdjacency = 0xB,
- TrianglesAdjacency = 0xC,
- TriangleStripAdjacency = 0xD,
- Patches = 0xE,
- };
- struct VertexArray {
- union {
- BitField<0, 16, u32> start;
- BitField<16, 12, u32> count;
- BitField<28, 3, PrimitiveTopology> topology;
- };
- };
- enum class PrimitiveTopologyOverride : u32 {
- None = 0x0,
- Points = 0x1,
- Lines = 0x2,
- LineStrip = 0x3,
- Triangles = 0x4,
- TriangleStrip = 0x5,
- LinesAdjacency = 0xA,
- LineStripAdjacency = 0xB,
- TrianglesAdjacency = 0xC,
- TriangleStripAdjacency = 0xD,
- Patches = 0xE,
- LegacyPoints = 0x1001,
- LegacyIndexedLines = 0x1002,
- LegacyIndexedTriangles = 0x1003,
- LegacyLines = 0x100F,
- LegacyLineStrip = 0x1010,
- LegacyIndexedLineStrip = 0x1011,
- LegacyTriangles = 0x1012,
- LegacyTriangleStrip = 0x1013,
- LegacyIndexedTriangleStrip = 0x1014,
- LegacyTriangleFan = 0x1015,
- LegacyIndexedTriangleFan = 0x1016,
- LegacyTriangleFanImm = 0x1017,
- LegacyLinesImm = 0x1018,
- LegacyIndexedTriangles2 = 0x101A,
- LegacyIndexedLines2 = 0x101B,
- };
- enum class DepthMode : u32 {
- MinusOneToOne = 0,
- ZeroToOne = 1,
- };
- enum class IndexFormat : u32 {
- UnsignedByte = 0x0,
- UnsignedShort = 0x1,
- UnsignedInt = 0x2,
- };
- enum class ComparisonOp : u32 {
- Never_D3D = 1,
- Less_D3D = 2,
- Equal_D3D = 3,
- LessEqual_D3D = 4,
- Greater_D3D = 5,
- NotEqual_D3D = 6,
- GreaterEqual_D3D = 7,
- Always_D3D = 8,
- Never_GL = 0x200,
- Less_GL = 0x201,
- Equal_GL = 0x202,
- LessEqual_GL = 0x203,
- Greater_GL = 0x204,
- NotEqual_GL = 0x205,
- GreaterEqual_GL = 0x206,
- Always_GL = 0x207,
- };
- enum class ClearReport : u32 {
- ZPassPixelCount = 0x01,
- ZCullStats = 0x02,
- StreamingPrimitvesNeededMinusSucceeded = 0x03,
- AlphaBetaClocks = 0x04,
- StreamingPrimitivesSucceeded = 0x10,
- StreamingPrimitivesNeeded = 0x11,
- VerticesGenerated = 0x12,
- PrimitivesGenerated = 0x13,
- VertexShaderInvocations = 0x15,
- TessellationInitInvocations = 0x16,
- TessellationShaderInvocations = 0x17,
- TessellationShaderPrimitivesGenerated = 0x18,
- GeometryShaderInvocations = 0x1A,
- GeometryShaderPrimitivesGenerated = 0x1B,
- ClipperInvocations = 0x1C,
- ClipperPrimitivesGenerated = 0x1D,
- PixelShaderInvocations = 0x1E,
- VtgPrimitivesOut = 0x1F,
- };
- enum class FrontFace : u32 {
- ClockWise = 0x900,
- CounterClockWise = 0x901,
- };
- enum class CullFace : u32 {
- Front = 0x404,
- Back = 0x405,
- FrontAndBack = 0x408,
- };
- struct Blend {
- enum class Equation : u32 {
- Add_D3D = 1,
- Subtract_D3D = 2,
- ReverseSubtract_D3D = 3,
- Min_D3D = 4,
- Max_D3D = 5,
- Add_GL = 0x8006,
- Min_GL = 0x8007,
- Max_GL = 0x8008,
- Subtract_GL = 0x800A,
- ReverseSubtract_GL = 0x800B
- };
- enum class Factor : u32 {
- Zero_D3D = 0x1,
- One_D3D = 0x2,
- SourceColor_D3D = 0x3,
- OneMinusSourceColor_D3D = 0x4,
- SourceAlpha_D3D = 0x5,
- OneMinusSourceAlpha_D3D = 0x6,
- DestAlpha_D3D = 0x7,
- OneMinusDestAlpha_D3D = 0x8,
- DestColor_D3D = 0x9,
- OneMinusDestColor_D3D = 0xA,
- SourceAlphaSaturate_D3D = 0xB,
- BothSourceAlpha_D3D = 0xC,
- OneMinusBothSourceAlpha_D3D = 0xD,
- BlendFactor_D3D = 0xE,
- OneMinusBlendFactor_D3D = 0xF,
- Source1Color_D3D = 0x10,
- OneMinusSource1Color_D3D = 0x11,
- Source1Alpha_D3D = 0x12,
- OneMinusSource1Alpha_D3D = 0x13,
- Zero_GL = 0x4000,
- One_GL = 0x4001,
- SourceColor_GL = 0x4300,
- OneMinusSourceColor_GL = 0x4301,
- SourceAlpha_GL = 0x4302,
- OneMinusSourceAlpha_GL = 0x4303,
- DestAlpha_GL = 0x4304,
- OneMinusDestAlpha_GL = 0x4305,
- DestColor_GL = 0x4306,
- OneMinusDestColor_GL = 0x4307,
- SourceAlphaSaturate_GL = 0x4308,
- ConstantColor_GL = 0xC001,
- OneMinusConstantColor_GL = 0xC002,
- ConstantAlpha_GL = 0xC003,
- OneMinusConstantAlpha_GL = 0xC004,
- Source1Color_GL = 0xC900,
- OneMinusSource1Color_GL = 0xC901,
- Source1Alpha_GL = 0xC902,
- OneMinusSource1Alpha_GL = 0xC903,
- };
- u32 separate_alpha;
- Equation color_op;
- Factor color_source;
- Factor color_dest;
- Equation alpha_op;
- Factor alpha_source;
- u32 enable_global_color_key;
- Factor alpha_dest;
- u32 single_rop_control_enable;
- u32 enable[NumRenderTargets];
- };
- struct BlendPerTarget {
- u32 separate_alpha;
- Blend::Equation color_op;
- Blend::Factor color_source;
- Blend::Factor color_dest;
- Blend::Equation alpha_op;
- Blend::Factor alpha_source;
- Blend::Factor alpha_dest;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- };
- static_assert(sizeof(BlendPerTarget) == 0x20);
- enum class PolygonMode : u32 {
- Point = 0x1B00,
- Line = 0x1B01,
- Fill = 0x1B02,
- };
- enum class ShadowRamControl : u32 {
- // write value to shadow ram
- Track = 0,
- // write value to shadow ram ( with validation ??? )
- TrackWithFilter = 1,
- // only write to real hw register
- Passthrough = 2,
- // write value from shadow ram to real hw register
- Replay = 3,
- };
- enum class ViewportSwizzle : u32 {
- PositiveX = 0,
- NegativeX = 1,
- PositiveY = 2,
- NegativeY = 3,
- PositiveZ = 4,
- NegativeZ = 5,
- PositiveW = 6,
- NegativeW = 7,
- };
- enum class SamplerBinding : u32 {
- Independently = 0,
- ViaHeaderBinding = 1,
- };
- struct TileMode {
- enum class DimensionControl : u32 {
- DepthDefinesArray = 0,
- DepthDefinesDepth = 1,
- };
- union {
- BitField<0, 4, u32> block_width;
- BitField<4, 4, u32> block_height;
- BitField<8, 4, u32> block_depth;
- BitField<12, 1, u32> is_pitch_linear;
- BitField<16, 1, DimensionControl> dim_control;
- };
- };
- static_assert(sizeof(TileMode) == 4);
- struct RenderTargetConfig {
- u32 address_high;
- u32 address_low;
- u32 width;
- u32 height;
- Tegra::RenderTargetFormat format;
- TileMode tile_mode;
- union {
- BitField<0, 16, u32> depth;
- BitField<16, 1, u32> volume;
- };
- u32 array_pitch;
- u32 base_layer;
- u32 mark_ieee_clean;
- INSERT_PADDING_BYTES_NOINIT(0x18);
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- static_assert(sizeof(RenderTargetConfig) == 0x40);
- struct ColorMask {
- union {
- u32 raw;
- BitField<0, 1, u32> R;
- BitField<4, 1, u32> G;
- BitField<8, 1, u32> B;
- BitField<12, 1, u32> A;
- };
- };
- struct ViewportTransform {
- f32 scale_x;
- f32 scale_y;
- f32 scale_z;
- f32 translate_x;
- f32 translate_y;
- f32 translate_z;
- union {
- u32 raw;
- BitField<0, 3, ViewportSwizzle> x;
- BitField<4, 3, ViewportSwizzle> y;
- BitField<8, 3, ViewportSwizzle> z;
- BitField<12, 3, ViewportSwizzle> w;
- } swizzle;
- union {
- BitField<0, 5, u32> x;
- BitField<8, 5, u32> y;
- } snap_grid_precision;
- Common::Rectangle<f32> GetRect() const {
- return {
- GetX(), // left
- GetY() + GetHeight(), // top
- GetX() + GetWidth(), // right
- GetY() // bottom
- };
- }
- f32 GetX() const {
- return std::max(0.0f, translate_x - std::fabs(scale_x));
- }
- f32 GetY() const {
- return std::max(0.0f, translate_y - std::fabs(scale_y));
- }
- f32 GetWidth() const {
- return translate_x + std::fabs(scale_x) - GetX();
- }
- f32 GetHeight() const {
- return translate_y + std::fabs(scale_y) - GetY();
- }
- };
- static_assert(sizeof(ViewportTransform) == 0x20);
- struct Viewport {
- enum class PixelCenter : u32 {
- HalfIntegers = 0,
- Integers = 1,
- };
- union {
- BitField<0, 16, u32> x;
- BitField<16, 16, u32> width;
- };
- union {
- BitField<0, 16, u32> y;
- BitField<16, 16, u32> height;
- };
- float depth_range_near;
- float depth_range_far;
- };
- static_assert(sizeof(Viewport) == 0x10);
- struct Window {
- union {
- u32 raw_1;
- BitField<0, 16, u32> x_min;
- BitField<16, 16, u32> x_max;
- };
- union {
- u32 raw_2;
- BitField<0, 16, u32> y_min;
- BitField<16, 16, u32> y_max;
- };
- };
- static_assert(sizeof(Window) == 0x8);
- struct ClipIdExtent {
- union {
- BitField<0, 16, u32> x;
- BitField<16, 16, u32> width;
- };
- union {
- BitField<0, 16, u32> y;
- BitField<16, 16, u32> height;
- };
- };
- static_assert(sizeof(ClipIdExtent) == 0x8);
- enum class VisibleCallLimit : u32 {
- Limit0 = 0,
- Limit1 = 1,
- Limit2 = 2,
- Limit4 = 3,
- Limit8 = 4,
- Limit16 = 5,
- Limit32 = 6,
- Limit64 = 7,
- Limit128 = 8,
- None = 15,
- };
- struct StatisticsCounter {
- union {
- BitField<0, 1, u32> da_vertices;
- BitField<1, 1, u32> da_primitives;
- BitField<2, 1, u32> vs_invocations;
- BitField<3, 1, u32> gs_invocations;
- BitField<4, 1, u32> gs_primitives;
- BitField<5, 1, u32> streaming_primitives_succeeded;
- BitField<6, 1, u32> streaming_primitives_needed;
- BitField<7, 1, u32> clipper_invocations;
- BitField<8, 1, u32> clipper_primitives;
- BitField<9, 1, u32> ps_invocations;
- BitField<11, 1, u32> ti_invocations;
- BitField<12, 1, u32> ts_invocations;
- BitField<13, 1, u32> ts_primitives;
- BitField<14, 1, u32> total_streaming_primitives_needed_succeeded;
- BitField<10, 1, u32> vtg_primitives_out;
- BitField<15, 1, u32> alpha_beta_clocks;
- };
- };
- struct ClearRect {
- union {
- BitField<0, 16, u32> x_min;
- BitField<16, 16, u32> x_max;
- };
- union {
- BitField<0, 16, u32> y_min;
- BitField<16, 16, u32> y_max;
- };
- };
- struct VertexBuffer {
- u32 first;
- u32 count;
- };
- struct InvalidateShaderCacheNoWFI {
- union {
- BitField<0, 1, u32> instruction;
- BitField<4, 1, u32> global_data;
- BitField<12, 1, u32> constant;
- };
- };
- struct ZCullSerialization {
- enum class Applied : u32 {
- Always = 0,
- LateZ = 1,
- OutOfGamutZ = 2,
- LateZOrOutOfGamutZ = 3,
- };
- union {
- BitField<0, 1, u32> enable;
- BitField<4, 2, Applied> applied;
- };
- };
- struct ZCullDirFormat {
- enum class Zdir : u32 {
- Less = 0,
- Greater = 1,
- };
- enum class Zformat : u32 {
- MSB = 0,
- FP = 1,
- Ztrick = 2,
- Zf32 = 3,
- };
- union {
- BitField<0, 16, Zdir> dir;
- BitField<16, 16, Zformat> format;
- };
- };
- struct IteratedBlend {
- union {
- BitField<0, 1, u32> enable;
- BitField<1, 1, u32> enable_alpha;
- };
- u32 pass_count;
- };
- struct ZCullCriterion {
- enum class Sfunc : u32 {
- Never = 0,
- Less = 1,
- Equal = 2,
- LessOrEqual = 3,
- Greater = 4,
- NotEqual = 5,
- GreaterOrEqual = 6,
- Always = 7,
- };
- union {
- BitField<0, 8, Sfunc> sfunc;
- BitField<8, 1, u32> no_invalidate;
- BitField<9, 1, u32> force_match;
- BitField<16, 8, u32> sref;
- BitField<24, 8, u32> smask;
- };
- };
- struct LoadIteratedBlend {
- enum class Test : u32 {
- False = 0,
- True = 1,
- Equal = 2,
- NotEqual = 3,
- LessThan = 4,
- LessOrEqual = 5,
- Greater = 6,
- GreaterOrEqual = 7,
- };
- enum class Operation : u32 {
- AddProducts = 0,
- SubProducts = 1,
- Min = 2,
- Max = 3,
- Reciprocal = 4,
- Add = 5,
- Sub = 6,
- };
- enum class OperandA : u32 {
- SrcRGB = 0,
- DstRGB = 1,
- SrcAAA = 2,
- DstAAA = 3,
- Temp0_RGB = 4,
- Temp1_RGB = 5,
- Temp2_RGB = 6,
- PBR_RGB = 7,
- };
- enum class OperandB : u32 {
- Zero = 0,
- One = 1,
- SrcRGB = 2,
- SrcAAA = 3,
- OneMinusSrcAAA = 4,
- DstRGB = 5,
- DstAAA = 6,
- OneMinusDstAAA = 7,
- Temp0_RGB = 9,
- Temp1_RGB = 10,
- Temp2_RGB = 11,
- PBR_RGB = 12,
- ConstRGB = 13,
- ZeroATimesB = 14,
- };
- enum class Swizzle : u32 {
- RGB = 0,
- GBR = 1,
- RRR = 2,
- GGG = 3,
- BBB = 4,
- RToA = 5,
- };
- enum class WriteMask : u32 {
- RGB = 0,
- ROnly = 1,
- GOnly = 2,
- BOnly = 3,
- };
- enum class Pass : u32 {
- Temp0 = 0,
- Temp1 = 1,
- Temp2 = 2,
- None = 3,
- };
- u32 instruction_ptr;
- union {
- BitField<0, 3, Test> test;
- BitField<3, 3, Operation> operation;
- BitField<6, 3, u32> const_input;
- BitField<9, 3, OperandA> operand_a;
- BitField<12, 4, OperandB> operand_b;
- BitField<16, 3, OperandA> operand_c;
- BitField<19, 4, OperandB> operand_d;
- BitField<23, 3, Swizzle> output_swizzle;
- BitField<26, 2, WriteMask> output_mask;
- BitField<28, 2, Pass> output_pass;
- BitField<31, 1, u32> test_enabled;
- };
- };
- struct ScissorTest {
- u32 enable;
- union {
- BitField<0, 16, u32> min_x;
- BitField<16, 16, u32> max_x;
- };
- union {
- BitField<0, 16, u32> min_y;
- BitField<16, 16, u32> max_y;
- };
- INSERT_PADDING_BYTES_NOINIT(0x4);
- };
- static_assert(sizeof(ScissorTest) == 0x10);
- struct VPCPerf {
- union {
- BitField<0, 8, u32> culled_small_lines;
- BitField<8, 8, u32> culled_small_triangles;
- BitField<16, 8, u32> nonculled_lines_and_points;
- BitField<24, 8, u32> nonculled_triangles;
- };
- };
- struct ConstantColorRendering {
- u32 enabled;
- u32 red;
- u32 green;
- u32 blue;
- u32 alpha;
- };
- struct VertexStreamSubstitute {
- u32 address_high;
- u32 address_low;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct VTGWarpWatermarks {
- union {
- BitField<0, 16, u32> low;
- BitField<16, 16, u32> high;
- };
- };
- struct SampleMask {
- struct Target {
- union {
- BitField<0, 1, u32> raster_out;
- BitField<4, 1, u32> color_target;
- };
- u32 target;
- };
- struct Pos {
- u32 x0_y0;
- u32 x1_y0;
- u32 x0_y1;
- u32 x1_y1;
- };
- };
- enum class NonMultisampledZ : u32 {
- PerSample = 0,
- PixelCenter = 1,
- };
- enum class TIRMode : u32 {
- Disabled = 0,
- RasterNTargetM = 1,
- };
- enum class AntiAliasRaster : u32 {
- Mode1x1 = 0,
- Mode2x2 = 2,
- Mode4x2_D3D = 4,
- Mode2x1_D3D = 5,
- Mode4x4 = 6,
- };
- struct SurfaceClipIDMemory {
- u32 address_high;
- u32 address_low;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct TIRModulation {
- enum class Component : u32 {
- None = 0,
- RGB = 1,
- AlphaOnly = 2,
- RGBA = 3,
- };
- enum class Function : u32 {
- Linear = 0,
- Table = 1,
- };
- Component component;
- Function function;
- };
- struct Zeta {
- u32 address_high;
- u32 address_low;
- Tegra::DepthFormat format;
- TileMode tile_mode;
- u32 array_pitch;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct SurfaceClip {
- union {
- BitField<0, 16, u32> x;
- BitField<16, 16, u32> width;
- };
- union {
- BitField<0, 16, u32> y;
- BitField<16, 16, u32> height;
- };
- };
- enum class L2CacheControlPolicy : u32 {
- First = 0,
- Normal = 1,
- Last = 2,
- };
- struct L2CacheVAFRequests {
- union {
- BitField<0, 1, u32> system_memory_volatile;
- BitField<4, 2, L2CacheControlPolicy> policy;
- };
- };
- enum class ViewportMulticast : u32 {
- ViewportOrder = 0,
- PrimitiveOrder = 1,
- };
- struct TIRModulationCoeff {
- union {
- BitField<0, 8, u32> table_v0;
- BitField<8, 8, u32> table_v1;
- BitField<16, 8, u32> table_v2;
- BitField<24, 8, u32> table_v3;
- };
- };
- static_assert(sizeof(TIRModulationCoeff) == 0x4);
- struct ReduceColorThreshold {
- union {
- BitField<0, 8, u32> all_hit_once;
- BitField<16, 8, u32> all_covered;
- };
- };
- struct ClearControl {
- union {
- BitField<0, 1, u32> respect_stencil_mask;
- BitField<4, 1, u32> use_clear_rect;
- BitField<8, 1, u32> use_scissor;
- BitField<12, 1, u32> use_viewport_clip0;
- };
- };
- struct L2CacheRopNonInterlockedReads {
- union {
- BitField<4, 2, L2CacheControlPolicy> policy;
- };
- };
- struct VertexOutputAttributeSkipMasks {
- struct Attributes {
- union {
- BitField<0, 1, u32> attribute0_comp0;
- BitField<1, 1, u32> attribute0_comp1;
- BitField<2, 1, u32> attribute0_comp2;
- BitField<3, 1, u32> attribute0_comp3;
- BitField<4, 1, u32> attribute1_comp0;
- BitField<5, 1, u32> attribute1_comp1;
- BitField<6, 1, u32> attribute1_comp2;
- BitField<7, 1, u32> attribute1_comp3;
- BitField<8, 1, u32> attribute2_comp0;
- BitField<9, 1, u32> attribute2_comp1;
- BitField<10, 1, u32> attribute2_comp2;
- BitField<11, 1, u32> attribute2_comp3;
- BitField<12, 1, u32> attribute3_comp0;
- BitField<13, 1, u32> attribute3_comp1;
- BitField<14, 1, u32> attribute3_comp2;
- BitField<15, 1, u32> attribute3_comp3;
- BitField<16, 1, u32> attribute4_comp0;
- BitField<17, 1, u32> attribute4_comp1;
- BitField<18, 1, u32> attribute4_comp2;
- BitField<19, 1, u32> attribute4_comp3;
- BitField<20, 1, u32> attribute5_comp0;
- BitField<21, 1, u32> attribute5_comp1;
- BitField<22, 1, u32> attribute5_comp2;
- BitField<23, 1, u32> attribute5_comp3;
- BitField<24, 1, u32> attribute6_comp0;
- BitField<25, 1, u32> attribute6_comp1;
- BitField<26, 1, u32> attribute6_comp2;
- BitField<27, 1, u32> attribute6_comp3;
- BitField<28, 1, u32> attribute7_comp0;
- BitField<29, 1, u32> attribute7_comp1;
- BitField<30, 1, u32> attribute7_comp2;
- BitField<31, 1, u32> attribute7_comp3;
- };
- };
- std::array<Attributes, 2> a;
- std::array<Attributes, 2> b;
- };
- struct TIRControl {
- union {
- BitField<0, 1, u32> z_pass_pixel_count_use_raster_samples;
- BitField<4, 1, u32> alpha_coverage_use_raster_samples;
- BitField<1, 1, u32> reduce_coverage;
- };
- };
- enum class FillViaTriangleMode : u32 {
- Disabled = 0,
- FillAll = 1,
- FillBoundingBox = 2,
- };
- struct PsTicketDispenserValue {
- union {
- BitField<0, 8, u32> index;
- BitField<8, 16, u32> value;
- };
- };
- struct RegisterWatermarks {
- union {
- BitField<0, 16, u32> low;
- BitField<16, 16, u32> high;
- };
- };
- enum class InvalidateCacheLines : u32 {
- All = 0,
- One = 1,
- };
- struct InvalidateTextureDataCacheNoWfi {
- union {
- BitField<0, 1, InvalidateCacheLines> lines;
- BitField<4, 22, u32> tag;
- };
- };
- struct ZCullRegionEnable {
- union {
- BitField<0, 1, u32> enable_z;
- BitField<4, 1, u32> enable_stencil;
- BitField<1, 1, u32> rect_clear;
- BitField<2, 1, u32> use_rt_array_index;
- BitField<5, 16, u32> rt_array_index;
- BitField<3, 1, u32> make_conservative;
- };
- };
- enum class FillMode : u32 {
- Point = 1,
- Wireframe = 2,
- Solid = 3,
- };
- enum class ShadeMode : u32 {
- Flat = 0x1,
- Gouraud = 0x2,
- GL_Flat = 0x1D00,
- GL_Smooth = 0x1D01,
- };
- enum class AlphaToCoverageDither : u32 {
- Footprint_1x1 = 0,
- Footprint_2x2 = 1,
- Footprint_1x1_Virtual = 2,
- };
- struct InlineIndex4x8 {
- union {
- BitField<0, 30, u32> count;
- BitField<30, 2, u32> start;
- };
- union {
- BitField<0, 8, u32> index0;
- BitField<8, 8, u32> index1;
- BitField<16, 8, u32> index2;
- BitField<24, 8, u32> index3;
- };
- };
- enum class D3DCullMode : u32 {
- None = 0,
- CW = 1,
- CCW = 2,
- };
- struct BlendColor {
- f32 r;
- f32 g;
- f32 b;
- f32 a;
- };
- struct StencilOp {
- enum class Op : u32 {
- Keep_D3D = 1,
- Zero_D3D = 2,
- Replace_D3D = 3,
- IncrSaturate_D3D = 4,
- DecrSaturate_D3D = 5,
- Invert_D3D = 6,
- Incr_D3D = 7,
- Decr_D3D = 8,
- Keep_GL = 0x1E00,
- Zero_GL = 0,
- Replace_GL = 0x1E01,
- IncrSaturate_GL = 0x1E02,
- DecrSaturate_GL = 0x1E03,
- Invert_GL = 0x150A,
- Incr_GL = 0x8507,
- Decr_GL = 0x8508,
- };
- Op fail;
- Op zfail;
- Op zpass;
- ComparisonOp func;
- };
- struct PsSaturate {
- // Opposite of DepthMode
- enum class Depth : u32 {
- ZeroToOne = 0,
- MinusOneToOne = 1,
- };
- union {
- BitField<0, 1, u32> output0_enable;
- BitField<1, 1, Depth> output0_range;
- BitField<4, 1, u32> output1_enable;
- BitField<5, 1, Depth> output1_range;
- BitField<8, 1, u32> output2_enable;
- BitField<9, 1, Depth> output2_range;
- BitField<12, 1, u32> output3_enable;
- BitField<13, 1, Depth> output3_range;
- BitField<16, 1, u32> output4_enable;
- BitField<17, 1, Depth> output4_range;
- BitField<20, 1, u32> output5_enable;
- BitField<21, 1, Depth> output5_range;
- BitField<24, 1, u32> output6_enable;
- BitField<25, 1, Depth> output6_range;
- BitField<28, 1, u32> output7_enable;
- BitField<29, 1, Depth> output7_range;
- };
- bool AnyEnabled() const {
- return output0_enable || output1_enable || output2_enable || output3_enable ||
- output4_enable || output5_enable || output6_enable || output7_enable;
- }
- };
- struct WindowOrigin {
- enum class Mode : u32 {
- UpperLeft = 0,
- LowerLeft = 1,
- };
- union {
- BitField<0, 1, Mode> mode;
- BitField<4, 1, u32> flip_y;
- };
- };
- struct IteratedBlendConstants {
- u32 r;
- u32 g;
- u32 b;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- };
- static_assert(sizeof(IteratedBlendConstants) == 0x10);
- struct UserClip {
- struct Enable {
- union {
- u32 raw;
- BitField<0, 1, u32> plane0;
- BitField<1, 1, u32> plane1;
- BitField<2, 1, u32> plane2;
- BitField<3, 1, u32> plane3;
- BitField<4, 1, u32> plane4;
- BitField<5, 1, u32> plane5;
- BitField<6, 1, u32> plane6;
- BitField<7, 1, u32> plane7;
- };
- bool AnyEnabled() const {
- return plane0 || plane1 || plane2 || plane3 || plane4 || plane5 || plane6 ||
- plane7;
- }
- };
- struct Op {
- enum class ClipOrCull : u32 {
- Clip = 0,
- Cull = 1,
- };
- union {
- u32 raw;
- BitField<0, 1, ClipOrCull> plane0;
- BitField<4, 1, ClipOrCull> plane1;
- BitField<8, 1, ClipOrCull> plane2;
- BitField<12, 1, ClipOrCull> plane3;
- BitField<16, 1, ClipOrCull> plane4;
- BitField<20, 1, ClipOrCull> plane5;
- BitField<24, 1, ClipOrCull> plane6;
- BitField<28, 1, ClipOrCull> plane7;
- };
- };
- };
- struct AntiAliasAlphaControl {
- union {
- BitField<0, 1, u32> alpha_to_coverage;
- BitField<4, 1, u32> alpha_to_one;
- };
- };
- struct RenderEnable {
- enum class Override : u32 {
- UseRenderEnable = 0,
- AlwaysRender = 1,
- NeverRender = 2,
- };
- enum class Mode : u32 {
- False = 0,
- True = 1,
- Conditional = 2,
- IfEqual = 3,
- IfNotEqual = 4,
- };
- u32 address_high;
- u32 address_low;
- Mode mode;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct TexSampler {
- u32 address_high;
- u32 address_low;
- u32 limit;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct TexHeader {
- u32 address_high;
- u32 address_low;
- u32 limit;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- enum class ZCullRegionFormat : u32 {
- Z_4x4 = 0,
- ZS_4x4 = 1,
- Z_4x2 = 2,
- Z_2x4 = 3,
- Z_16x8_4x4 = 4,
- Z_8x8_4x2 = 5,
- Z_8x8_2x4 = 6,
- Z_16x16_4x8 = 7,
- Z_4x8_2x2 = 8,
- ZS_16x8_4x2 = 9,
- ZS_16x8_2x4 = 10,
- ZS_8x8_2x2 = 11,
- Z_4x8_1x1 = 12,
- };
- struct RtLayer {
- enum class Control {
- LayerSelectsLayer = 0,
- GeometryShaderSelectsLayer = 1,
- };
- union {
- BitField<0, 16, u32> layer;
- BitField<16, 1, u32> control;
- };
- };
- struct InlineIndex2x16 {
- union {
- BitField<0, 31, u32> count;
- BitField<31, 1, u32> start_odd;
- };
- union {
- BitField<0, 16, u32> even;
- BitField<16, 16, u32> odd;
- };
- };
- struct VertexGlobalBaseOffset {
- u32 address_high;
- u32 address_low;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct ZCullRegionPixelOffset {
- u32 width;
- u32 height;
- };
- struct PointSprite {
- enum class RMode : u32 {
- Zero = 0,
- FromR = 1,
- FromS = 2,
- };
- enum class Origin : u32 {
- Bottom = 0,
- Top = 1,
- };
- enum class Texture : u32 {
- Passthrough = 0,
- Generate = 1,
- };
- union {
- BitField<0, 2, RMode> rmode;
- BitField<2, 1, Origin> origin;
- BitField<3, 1, Texture> texture0;
- BitField<4, 1, Texture> texture1;
- BitField<5, 1, Texture> texture2;
- BitField<6, 1, Texture> texture3;
- BitField<7, 1, Texture> texture4;
- BitField<8, 1, Texture> texture5;
- BitField<9, 1, Texture> texture6;
- BitField<10, 1, Texture> texture7;
- BitField<11, 1, Texture> texture8;
- BitField<12, 1, Texture> texture9;
- };
- };
- struct ProgramRegion {
- u32 address_high;
- u32 address_low;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct DefaultAttributes {
- enum class Diffuse : u32 {
- Vector_0001 = 0,
- Vector_1111 = 1,
- };
- enum class Specular : u32 {
- Vector_0000 = 0,
- Vector_0001 = 1,
- };
- enum class Vector : u32 {
- Vector_0000 = 0,
- Vector_0001 = 1,
- };
- enum class FixedFncTexture : u32 {
- Vector_0000 = 0,
- Vector_0001 = 1,
- };
- enum class DX9Color0 : u32 {
- Vector_0000 = 0,
- Vector_1111 = 1,
- };
- enum class DX9Color1To15 : u32 {
- Vector_0000 = 0,
- Vector_0001 = 1,
- };
- union {
- BitField<0, 1, Diffuse> color_front_diffuse;
- BitField<1, 1, Specular> color_front_specular;
- BitField<2, 1, Vector> generic_vector;
- BitField<3, 1, FixedFncTexture> fixed_fnc_texture;
- BitField<4, 1, DX9Color0> dx9_color0;
- BitField<5, 1, DX9Color1To15> dx9_color1_to_15;
- };
- };
- struct Draw {
- enum class PrimitiveId : u32 {
- First = 0,
- Unchanged = 1,
- };
- enum class InstanceId : u32 {
- First = 0,
- Subsequent = 1,
- Unchanged = 2,
- };
- enum class SplitMode : u32 {
- NormalBeginNormal = 0,
- NormalBeginOpen = 1,
- OpenBeginOpen = 2,
- OpenBeginNormal = 3,
- };
- u32 end;
- union {
- u32 begin;
- BitField<0, 16, PrimitiveTopology> topology;
- BitField<24, 1, PrimitiveId> primitive_id;
- BitField<26, 2, InstanceId> instance_id;
- BitField<29, 2, SplitMode> split_mode;
- };
- };
- struct VertexIdCopy {
- union {
- BitField<0, 1, u32> enable;
- BitField<4, 8, u32> attribute_slot;
- };
- };
- struct ShaderBasedCull {
- union {
- BitField<1, 1, u32> batch_cull_enable;
- BitField<0, 1, u32> before_fetch_enable;
- };
- };
- struct ClassVersion {
- union {
- BitField<0, 16, u32> current;
- BitField<16, 16, u32> oldest_supported;
- };
- };
- struct PrimitiveRestart {
- u32 enabled;
- u32 index;
- };
- struct OutputVertexId {
- union {
- BitField<12, 1, u32> uses_array_start;
- };
- };
- enum class PointCenterMode : u32 {
- GL = 0,
- D3D = 1,
- };
- enum class LineSmoothParams : u32 {
- Falloff_1_00 = 0,
- Falloff_1_33 = 1,
- Falloff_1_66 = 2,
- };
- struct LineSmoothEdgeTable {
- union {
- BitField<0, 8, u32> v0;
- BitField<8, 8, u32> v1;
- BitField<16, 8, u32> v2;
- BitField<24, 8, u32> v3;
- };
- };
- struct LineStippleParams {
- union {
- BitField<0, 8, u32> factor;
- BitField<8, 16, u32> pattern;
- };
- };
- enum class ProvokingVertex : u32 {
- First = 0,
- Last = 1,
- };
- struct ShaderControl {
- enum class Partial : u32 {
- Zero = 0,
- Infinity = 1,
- };
- enum class FP32NanBehavior : u32 {
- Legacy = 0,
- FP64Compatible = 1,
- };
- enum class FP32F2INanBehavior : u32 {
- PassZero = 0,
- PassIndefinite = 1,
- };
- union {
- BitField<0, 1, Partial> default_partial;
- BitField<1, 1, FP32NanBehavior> fp32_nan_behavior;
- BitField<2, 1, FP32F2INanBehavior> fp32_f2i_nan_behavior;
- };
- };
- struct SphVersion {
- union {
- BitField<0, 16, u32> current;
- BitField<16, 16, u32> oldest_supported;
- };
- };
- struct AlphaToCoverageOverride {
- union {
- BitField<0, 1, u32> qualify_by_anti_alias_enable;
- BitField<1, 1, u32> qualify_by_ps_sample_mask_enable;
- };
- };
- struct AamVersion {
- union {
- BitField<0, 16, u32> current;
- BitField<16, 16, u32> oldest_supported;
- };
- };
- struct IndexBuffer {
- u32 start_addr_high;
- u32 start_addr_low;
- u32 limit_addr_high;
- u32 limit_addr_low;
- IndexFormat format;
- u32 first;
- u32 count;
- unsigned FormatSizeInBytes() const {
- switch (format) {
- case IndexFormat::UnsignedByte:
- return 1;
- case IndexFormat::UnsignedShort:
- return 2;
- case IndexFormat::UnsignedInt:
- return 4;
- }
- ASSERT(false);
- return 1;
- }
- GPUVAddr StartAddress() const {
- return (GPUVAddr{start_addr_high} << 32) | GPUVAddr{start_addr_low};
- }
- GPUVAddr EndAddress() const {
- return (GPUVAddr{limit_addr_high} << 32) | GPUVAddr{limit_addr_low};
- }
- /// Adjust the index buffer offset so it points to the first desired index.
- GPUVAddr IndexStart() const {
- return StartAddress() + size_t{first} * size_t{FormatSizeInBytes()};
- }
- };
- struct IndexBufferSmall {
- union {
- u32 raw;
- BitField<0, 16, u32> first;
- BitField<16, 12, u32> count;
- BitField<28, 4, PrimitiveTopology> topology;
- };
- };
- struct VertexStreamInstances {
- std::array<u32, NumVertexArrays> is_instanced;
- /// Returns whether the vertex array specified by index is supposed to be
- /// accessed per instance or not.
- bool IsInstancingEnabled(std::size_t index) const {
- return is_instanced[index];
- }
- };
- struct AttributePointSize {
- union {
- BitField<0, 1, u32> enabled;
- BitField<4, 8, u32> slot;
- };
- };
- struct ViewportClipControl {
- enum class GeometryGuardband : u32 {
- Scale256 = 0,
- Scale1 = 1,
- };
- enum class GeometryClip : u32 {
- WZero = 0,
- Passthrough = 1,
- FrustumXY = 2,
- FrustumXYZ = 3,
- WZeroNoZCull = 4,
- FrustumZ = 5,
- WZeroTriFillOrClip = 6,
- };
- enum class GeometryGuardbandZ : u32 {
- SameAsXY = 0,
- Scale256 = 1,
- Scale1 = 2,
- };
- union {
- BitField<0, 1, u32> depth_0_to_1;
- BitField<3, 1, u32> pixel_min_z;
- BitField<4, 1, u32> pixel_max_z;
- BitField<7, 1, GeometryGuardband> geometry_guardband;
- BitField<11, 3, GeometryClip> geometry_clip;
- BitField<1, 2, GeometryGuardbandZ> geometry_guardband_z;
- };
- };
- enum class PrimitiveTopologyControl : u32 {
- UseInBeginMethods = 0,
- UseSeparateState = 1,
- };
- struct WindowClip {
- enum class Type : u32 {
- Inclusive = 0,
- Exclusive = 1,
- ClipAll = 2,
- };
- u32 enable;
- Type type;
- };
- enum class InvalidateZCull : u32 {
- Invalidate = 0,
- };
- struct ZCull {
- union {
- BitField<0, 1, u32> z_enable;
- BitField<1, 1, u32> stencil_enable;
- };
- union {
- BitField<0, 1, u32> z_min_enbounded;
- BitField<1, 1, u32> z_max_unbounded;
- };
- };
- struct LogicOp {
- enum class Op : u32 {
- Clear = 0x1500,
- And = 0x1501,
- AndReverse = 0x1502,
- Copy = 0x1503,
- AndInverted = 0x1504,
- NoOp = 0x1505,
- Xor = 0x1506,
- Or = 0x1507,
- Nor = 0x1508,
- Equiv = 0x1509,
- Invert = 0x150A,
- OrReverse = 0x150B,
- CopyInverted = 0x150C,
- OrInverted = 0x150D,
- Nand = 0x150E,
- Set = 0x150F,
- };
- u32 enable;
- Op op;
- };
- struct ClearSurface {
- union {
- u32 raw;
- BitField<0, 1, u32> Z;
- BitField<1, 1, u32> S;
- BitField<2, 1, u32> R;
- BitField<3, 1, u32> G;
- BitField<4, 1, u32> B;
- BitField<5, 1, u32> A;
- BitField<6, 4, u32> RT;
- BitField<10, 16, u32> layer;
- };
- };
- struct ReportSemaphore {
- struct Compare {
- u32 initial_sequence;
- u32 initial_mode;
- u32 unknown1;
- u32 unknown2;
- u32 current_sequence;
- u32 current_mode;
- };
- enum class Operation : u32 {
- Release = 0,
- Acquire = 1,
- ReportOnly = 2,
- Trap = 3,
- };
- enum class Release : u32 {
- AfterAllPreceedingReads = 0,
- AfterAllPreceedingWrites = 1,
- };
- enum class Acquire : u32 {
- BeforeAnyFollowingWrites = 0,
- BeforeAnyFollowingReads = 1,
- };
- enum class Location : u32 {
- None = 0,
- VertexFetch = 1,
- VertexShader = 2,
- VPC = 4,
- StreamingOutput = 5,
- GeometryShader = 6,
- ZCull = 7,
- TessellationInit = 8,
- TessellationShader = 9,
- PixelShader = 10,
- DepthTest = 12,
- All = 15,
- };
- enum class Comparison : u32 {
- NotEqual = 0,
- GreaterOrEqual = 1,
- };
- enum class Report : u32 {
- Payload = 0, // "None" in docs, but confirmed via hardware to return the payload
- VerticesGenerated = 1,
- ZPassPixelCount = 2,
- PrimitivesGenerated = 3,
- AlphaBetaClocks = 4,
- VertexShaderInvocations = 5,
- StreamingPrimitivesNeededMinusSucceeded = 6,
- GeometryShaderInvocations = 7,
- GeometryShaderPrimitivesGenerated = 9,
- ZCullStats0 = 10,
- StreamingPrimitivesSucceeded = 11,
- ZCullStats1 = 12,
- StreamingPrimitivesNeeded = 13,
- ZCullStats2 = 14,
- ClipperInvocations = 15,
- ZCullStats3 = 16,
- ClipperPrimitivesGenerated = 17,
- VtgPrimitivesOut = 18,
- PixelShaderInvocations = 19,
- ZPassPixelCount64 = 21,
- IEEECleanColorTarget = 24,
- IEEECleanZetaTarget = 25,
- StreamingByteCount = 26,
- TessellationInitInvocations = 27,
- BoundingRectangle = 28,
- TessellationShaderInvocations = 29,
- TotalStreamingPrimitivesNeededMinusSucceeded = 30,
- TessellationShaderPrimitivesGenerated = 31,
- };
- u32 address_high;
- u32 address_low;
- u32 payload;
- union {
- u32 raw;
- BitField<0, 2, Operation> operation;
- BitField<4, 1, Release> release;
- BitField<8, 1, Acquire> acquire;
- BitField<12, 4, Location> location;
- BitField<16, 1, Comparison> comparison;
- BitField<20, 1, u32> awaken_enable;
- BitField<23, 5, Report> report;
- BitField<28, 1, u32> short_query;
- BitField<5, 3, u32> sub_report;
- BitField<21, 1, u32> dword_number;
- BitField<2, 1, u32> disable_flush;
- BitField<3, 1, u32> reduction_enable;
- BitField<9, 3, ReductionOp> reduction_op;
- BitField<17, 2, u32> format_signed;
- } query;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct VertexStream {
- union {
- BitField<0, 12, u32> stride;
- BitField<12, 1, u32> enable;
- };
- u32 address_high;
- u32 address_low;
- u32 frequency;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- bool IsEnabled() const {
- return enable != 0 && Address() != 0;
- }
- };
- static_assert(sizeof(VertexStream) == 0x10);
- struct VertexStreamLimit {
- u32 address_high;
- u32 address_low;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- static_assert(sizeof(VertexStreamLimit) == 0x8);
- enum class ShaderType : u32 {
- VertexA = 0,
- VertexB = 1,
- TessellationInit = 2,
- Tessellation = 3,
- Geometry = 4,
- Pixel = 5,
- };
- struct Pipeline {
- union {
- BitField<0, 1, u32> enable;
- BitField<4, 4, ShaderType> program;
- };
- u32 offset;
- u32 reservedA;
- u32 register_count;
- u32 binding_group;
- std::array<u32, 4> reserved;
- INSERT_PADDING_BYTES_NOINIT(0x1C);
- };
- static_assert(sizeof(Pipeline) == 0x40);
- bool IsShaderConfigEnabled(std::size_t index) const {
- // The VertexB is always enabled.
- if (index == static_cast<std::size_t>(ShaderType::VertexB)) {
- return true;
- }
- return pipelines[index].enable != 0;
- }
- bool IsShaderConfigEnabled(ShaderType type) const {
- return IsShaderConfigEnabled(static_cast<std::size_t>(type));
- }
- struct ConstantBuffer {
- u32 size;
- u32 address_high;
- u32 address_low;
- u32 offset;
- std::array<u32, NumCBData> buffer;
- GPUVAddr Address() const {
- return (GPUVAddr{address_high} << 32) | GPUVAddr{address_low};
- }
- };
- struct BindGroup {
- std::array<u32, 4> reserved;
- union {
- u32 raw_config;
- BitField<0, 1, u32> valid;
- BitField<4, 5, u32> shader_slot;
- };
- INSERT_PADDING_BYTES_NOINIT(0xC);
- };
- static_assert(sizeof(BindGroup) == 0x20);
- struct StreamOutLayout {
- union {
- BitField<0, 8, u32> attribute0;
- BitField<8, 8, u32> attribute1;
- BitField<16, 8, u32> attribute2;
- BitField<24, 8, u32> attribute3;
- };
- };
- struct ShaderPerformance {
- struct ControlA {
- union {
- BitField<0, 2, u32> event0;
- BitField<2, 3, u32> bit0;
- BitField<5, 2, u32> event1;
- BitField<7, 3, u32> bit1;
- BitField<10, 2, u32> event2;
- BitField<12, 3, u32> bit2;
- BitField<15, 2, u32> event3;
- BitField<17, 3, u32> bit3;
- BitField<20, 2, u32> event4;
- BitField<22, 3, u32> bit4;
- BitField<25, 2, u32> event5;
- BitField<27, 3, u32> bit5;
- BitField<30, 2, u32> spare;
- };
- };
- struct ControlB {
- union {
- BitField<0, 1, u32> edge;
- BitField<1, 2, u32> mode;
- BitField<3, 1, u32> windowed;
- BitField<4, 16, u32> func;
- };
- };
- std::array<u32, 8> values_upper;
- std::array<u32, 8> values;
- std::array<u32, 8> events;
- std::array<ControlA, 8> control_a;
- std::array<ControlB, 8> control_b;
- u32 trap_control_mask;
- u32 start_shader_mask;
- u32 stop_shader_mask;
- };
- // clang-format off
- union {
- struct {
- ID object_id; ///< 0x0000
- INSERT_PADDING_BYTES_NOINIT(0xFC);
- u32 nop; ///< 0x0100
- Notify notify; ///< 0x0104
- u32 wait_for_idle; ///< 0x0110
- LoadMME load_mme; ///< 0x0114
- ShadowRamControl shadow_ram_control; ///< 0x0124
- PeerSemaphore peer; ///< 0x0128
- GlobalRender global_render; ///< 0x0130
- u32 go_idle; ///< 0x013C
- u32 trigger; ///< 0x0140
- u32 trigger_wfi; ///< 0x0144
- INSERT_PADDING_BYTES_NOINIT(0x8);
- u32 instrumentation_method_header; ///< 0x0150
- u32 instrumentation_method_data; ///< 0x0154
- INSERT_PADDING_BYTES_NOINIT(0x28);
- Upload::Registers upload; ///< 0x0180
- LaunchDMA launch_dma; ///< 0x01B0
- u32 inline_data; ///< 0x01B4
- INSERT_PADDING_BYTES_NOINIT(0x24);
- I2M i2m; ///< 0x01DC
- u32 run_ds_now; ///< 0x0200
- OpportunisticEarlyZ opportunistic_early_z; ///< 0x0204
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 aliased_line_width_enabled; ///< 0x020C
- u32 mandated_early_z; ///< 0x0210
- GeometryShaderDmFifo gs_dm_fifo; ///< 0x0214
- L2CacheControl l2_cache_control; ///< 0x0218
- InvalidateShaderCache invalidate_shader_cache; ///< 0x021C
- INSERT_PADDING_BYTES_NOINIT(0xA8);
- SyncInfo sync_info; ///< 0x02C8
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 prim_circular_buffer_throttle; ///< 0x02D0
- u32 flush_invalidate_rop_mini_cache; ///< 0x02D4
- SurfaceClipBlockId surface_clip_block_id; ///< 0x02D8
- u32 alpha_circular_buffer_size; ///< 0x02DC
- DecompressSurface decompress_surface; ///< 0x02E0
- ZCullRopBypass zcull_rop_bypass; ///< 0x02E4
- ZCullSubregion zcull_subregion; ///< 0x02E8
- RasterBoundingBox raster_bounding_box; ///< 0x02EC
- u32 peer_semaphore_release; ///< 0x02F0
- u32 iterated_blend_optimization; ///< 0x02F4
- ZCullSubregionAllocation zcull_subregion_allocation; ///< 0x02F8
- ZCullSubregionAlgorithm zcull_subregion_algorithm; ///< 0x02FC
- PixelShaderOutputSampleMaskUsage ps_output_sample_mask_usage; ///< 0x0300
- u32 draw_zero_index; ///< 0x0304
- L1Configuration l1_configuration; ///< 0x0308
- u32 render_enable_control_load_const_buffer; ///< 0x030C
- SPAVersion spa_version; ///< 0x0310
- u32 ieee_clean_update; ///< 0x0314
- SnapGrid snap_grid; ///< 0x0318
- Tessellation tessellation; ///< 0x0320
- SubTilingPerf sub_tiling_perf; ///< 0x0360
- ZCullSubregionReport zcull_subregion_report; ///< 0x036C
- BalancedPrimitiveWorkload balanced_primitive_workload; ///< 0x0374
- u32 max_patches_per_batch; ///< 0x0378
- u32 rasterize_enable; ///< 0x037C
- TransformFeedback transform_feedback; ///< 0x0380
- u32 raster_input; ///< 0x0740
- u32 transform_feedback_enabled; ///< 0x0744
- u32 primitive_restart_topology_change_enable; ///< 0x0748
- u32 alpha_fraction; ///< 0x074C
- INSERT_PADDING_BYTES_NOINIT(0x4);
- HybridAntiAliasControl hybrid_aa_control; ///< 0x0754
- INSERT_PADDING_BYTES_NOINIT(0x24);
- ShaderLocalMemory shader_local_memory; ///< 0x077C
- u32 color_zero_bandwidth_clear; ///< 0x07A4
- u32 z_zero_bandwidth_clear; ///< 0x07A8
- u32 isbe_save_restore_program_offset; ///< 0x07AC
- INSERT_PADDING_BYTES_NOINIT(0x10);
- ZCullRegion zcull_region; ///< 0x07C0
- ZetaReadOnly zeta_read_only; ///< 0x07F8
- INSERT_PADDING_BYTES_NOINIT(0x4);
- std::array<RenderTargetConfig, NumRenderTargets> rt; ///< 0x0800
- std::array<ViewportTransform, NumViewports> viewport_transform; ///< 0x0A00
- std::array<Viewport, NumViewports> viewports; ///< 0x0C00
- std::array<Window, 8> windows; ///< 0x0D00
- std::array<ClipIdExtent, 4> clip_id_extent; ///< 0x0D40
- u32 max_geometry_instances_per_task; ///< 0x0D60
- VisibleCallLimit visible_call_limit; ///< 0x0D64
- StatisticsCounter statistics_count; ///< 0x0D68
- ClearRect clear_rect; ///< 0x0D6C
- VertexBuffer vertex_buffer; ///< 0x0D74
- DepthMode depth_mode; ///< 0x0D7C
- std::array<f32, 4> clear_color; ///< 0x0D80
- f32 clear_depth; ///< 0x0D90
- u32 shader_cache_icache_prefetch; ///< 0x0D94
- u32 force_transition_to_beta; ///< 0x0D98
- u32 reduce_colour_thresholds; ///< 0x0D9C
- s32 clear_stencil; ///< 0x0DA0
- InvalidateShaderCacheNoWFI invalidate_shader_cache_no_wfi; ///< 0x0DA4
- ZCullSerialization zcull_serialization; ///< 0x0DA8
- PolygonMode polygon_mode_front; ///< 0x0DAC
- PolygonMode polygon_mode_back; ///< 0x0DB0
- u32 polygon_smooth; ///< 0x0DB4
- u32 zeta_mark_clean_ieee; ///< 0x0DB8
- ZCullDirFormat zcull_dir_format; ///< 0x0DBC
- u32 polygon_offset_point_enable; ///< 0x0DC0
- u32 polygon_offset_line_enable; ///< 0x0DC4
- u32 polygon_offset_fill_enable; ///< 0x0DC8
- u32 patch_vertices; ///< 0x0DCC
- IteratedBlend iterated_blend; ///< 0x0DD0
- ZCullCriterion zcull_criteria; ///< 0x0DD8
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 fragment_barrier; ///< 0x0DE0
- u32 sm_timeout; ///< 0x0DE4
- u32 primitive_restart_array; ///< 0x0DE8
- INSERT_PADDING_BYTES_NOINIT(0x4);
- LoadIteratedBlend load_iterated_blend; ///< 0x0DF0
- u32 window_offset_x; ///< 0x0DF8
- u32 window_offset_y; ///< 0x0DFC
- std::array<ScissorTest, NumViewports> scissor_test; ///< 0x0E00
- INSERT_PADDING_BYTES_NOINIT(0x10);
- u32 select_texture_headers; ///< 0x0F10
- VPCPerf vpc_perf; ///< 0x0F14
- u32 pm_local_trigger; ///< 0x0F18
- u32 post_z_pixel_imask; ///< 0x0F1C
- INSERT_PADDING_BYTES_NOINIT(0x20);
- ConstantColorRendering const_color_rendering; ///< 0x0F40
- u32 stencil_back_ref; ///< 0x0F54
- u32 stencil_back_mask; ///< 0x0F58
- u32 stencil_back_func_mask; ///< 0x0F5C
- INSERT_PADDING_BYTES_NOINIT(0x14);
- u32 invalidate_texture_data_cache; ///< 0x0F74 Assumed - Not in official docs.
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 tiled_cache_barrier; ///< 0x0F7C Assumed - Not in official docs.
- INSERT_PADDING_BYTES_NOINIT(0x4);
- VertexStreamSubstitute vertex_stream_substitute; ///< 0x0F84
- u32 line_mode_clip_generated_edge_do_not_draw; ///< 0x0F8C
- u32 color_mask_common; ///< 0x0F90
- INSERT_PADDING_BYTES_NOINIT(0x4);
- VTGWarpWatermarks vtg_warp_watermarks; ///< 0x0F98
- f32 depth_bounds[2]; ///< 0x0F9C
- SampleMask::Target sample_mask_target; ///< 0x0FA4
- u32 color_target_mrt_enable; ///< 0x0FAC
- NonMultisampledZ non_multisampled_z; ///< 0x0FB0
- TIRMode tir_mode; ///< 0x0FB4
- AntiAliasRaster anti_alias_raster; ///< 0x0FB8
- SampleMask::Pos sample_mask_pos; ///< 0x0FBC
- SurfaceClipIDMemory surface_clip_id_memory; ///< 0x0FCC
- TIRModulation tir_modulation; ///< 0x0FD4
- u32 blend_control_allow_float_pixel_kills; ///< 0x0FDC
- Zeta zeta; ///< 0x0FE0
- SurfaceClip surface_clip; ///< 0x0FF4
- u32 tiled_cache_treat_heavy_as_light; ///< 0x0FFC
- L2CacheVAFRequests l2_cache_vaf; ///< 0x1000
- ViewportMulticast viewport_multicast; ///< 0x1004
- u32 tessellation_cut_height; ///< 0x1008
- u32 max_gs_instances_per_task; ///< 0x100C
- u32 max_gs_output_vertices_per_task; ///< 0x1010
- u32 reserved_sw_method0; ///< 0x1014
- u32 gs_output_cb_storage_multiplier; ///< 0x1018
- u32 beta_cb_storage_constant; ///< 0x101C
- u32 ti_output_cb_storage_multiplier; ///< 0x1020
- u32 alpha_cb_storage_constraint; ///< 0x1024
- u32 reserved_sw_method1; ///< 0x1028
- u32 reserved_sw_method2; ///< 0x102C
- std::array<TIRModulationCoeff, 5> tir_modulation_coeff; ///< 0x1030
- std::array<u32, 15> spare_nop; ///< 0x1044
- INSERT_PADDING_BYTES_NOINIT(0x30);
- std::array<u32, 7> reserved_sw_method3_to_7; ///< 0x10B0
- ReduceColorThreshold reduce_color_thresholds_unorm8; ///< 0x10CC
- std::array<u32, 4> reserved_sw_method10_to_13; ///< 0x10D0
- ReduceColorThreshold reduce_color_thresholds_unorm10; ///< 0x10E0
- ReduceColorThreshold reduce_color_thresholds_unorm16; ///< 0x10E4
- ReduceColorThreshold reduce_color_thresholds_fp11; ///< 0x10E8
- ReduceColorThreshold reduce_color_thresholds_fp16; ///< 0x10EC
- ReduceColorThreshold reduce_color_thresholds_srgb8; ///< 0x10F0
- u32 unbind_all_constant_buffers; ///< 0x10F4
- ClearControl clear_control; ///< 0x10F8
- L2CacheRopNonInterlockedReads l2_cache_rop_non_interlocked_reads; ///< 0x10FC
- u32 reserved_sw_method14; ///< 0x1100
- u32 reserved_sw_method15; ///< 0x1104
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 no_operation_data_high; ///< 0x110C
- u32 depth_bias_control; ///< 0x1110
- u32 pm_trigger_end; ///< 0x1114
- u32 vertex_id_base; ///< 0x1118
- u32 stencil_compression_enabled; ///< 0x111C
- VertexOutputAttributeSkipMasks vertex_output_attribute_skip_masks; ///< 0x1120
- TIRControl tir_control; ///< 0x1130
- u32 mutable_method_treat_mutable_as_heavy; ///< 0x1134
- u32 post_ps_use_pre_ps_coverage; ///< 0x1138
- FillViaTriangleMode fill_via_triangle_mode; ///< 0x113C
- u32 blend_per_format_snorm8_unorm16_snorm16_enabled; ///< 0x1140
- u32 flush_pending_writes_sm_gloal_store; ///< 0x1144
- u32 conservative_raster_enable; ///< 0x1148 Assumed - Not in official docs.
- INSERT_PADDING_BYTES_NOINIT(0x14);
- std::array<VertexAttribute, NumVertexAttributes> vertex_attrib_format; ///< 0x1160
- std::array<MsaaSampleLocation, 4> multisample_sample_locations; ///< 0x11E0
- u32 offset_render_target_index_by_viewport_index; ///< 0x11F0
- u32 force_heavy_method_sync; ///< 0x11F4
- MultisampleCoverageToColor multisample_coverage_to_color; ///< 0x11F8
- DecompressZetaSurface decompress_zeta_surface; ///< 0x11FC
- INSERT_PADDING_BYTES_NOINIT(0x8);
- ZetaSparse zeta_sparse; ///< 0x1208
- u32 invalidate_sampler_cache; ///< 0x120C
- u32 invalidate_texture_header_cache; ///< 0x1210
- VertexArray vertex_array_instance_first; ///< 0x1214
- VertexArray vertex_array_instance_subsequent; ///< 0x1218
- RtControl rt_control; ///< 0x121C
- CompressionThresholdSamples compression_threshold_samples; ///< 0x1220
- PixelShaderInterlockControl ps_interlock_control; ///< 0x1224
- ZetaSize zeta_size; ///< 0x1228
- SamplerBinding sampler_binding; ///< 0x1234
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 draw_auto_byte_count; ///< 0x123C
- std::array<u32, 8> post_vtg_shader_attrib_skip_mask; ///< 0x1240
- PsTicketDispenserValue ps_ticket_dispenser_value; ///< 0x1260
- INSERT_PADDING_BYTES_NOINIT(0x1C);
- u32 circular_buffer_size; ///< 0x1280
- RegisterWatermarks vtg_register_watermarks; ///< 0x1284
- InvalidateTextureDataCacheNoWfi invalidate_texture_cache_no_wfi; ///< 0x1288
- INSERT_PADDING_BYTES_NOINIT(0x4);
- L2CacheRopNonInterlockedReads l2_cache_rop_interlocked_reads; ///< 0x1290
- INSERT_PADDING_BYTES_NOINIT(0x10);
- u32 primitive_restart_topology_change_index; ///< 0x12A4
- INSERT_PADDING_BYTES_NOINIT(0x20);
- ZCullRegionEnable zcull_region_enable; ///< 0x12C8
- u32 depth_test_enable; ///< 0x12CC
- FillMode fill_mode; ///< 0x12D0
- ShadeMode shade_mode; ///< 0x12D4
- L2CacheRopNonInterlockedReads l2_cache_rop_non_interlocked_writes; ///< 0x12D8
- L2CacheRopNonInterlockedReads l2_cache_rop_interlocked_writes; ///< 0x12DC
- AlphaToCoverageDither alpha_to_coverage_dither; ///< 0x12E0
- u32 blend_per_target_enabled; ///< 0x12E4
- u32 depth_write_enabled; ///< 0x12E8
- u32 alpha_test_enabled; ///< 0x12EC
- INSERT_PADDING_BYTES_NOINIT(0x10);
- InlineIndex4x8 inline_index_4x8; ///< 0x1300
- D3DCullMode d3d_cull_mode; ///< 0x1308
- ComparisonOp depth_test_func; ///< 0x130C
- f32 alpha_test_ref; ///< 0x1310
- ComparisonOp alpha_test_func; ///< 0x1314
- u32 draw_auto_stride; ///< 0x1318
- BlendColor blend_color; ///< 0x131C
- INSERT_PADDING_BYTES_NOINIT(0x4);
- InvalidateCacheLines invalidate_sampler_cache_lines; ///< 0x1330
- InvalidateCacheLines invalidate_texture_header_cache_lines; ///< 0x1334
- InvalidateCacheLines invalidate_texture_data_cache_lines; ///< 0x1338
- Blend blend; ///< 0x133C
- u32 stencil_enable; ///< 0x1380
- StencilOp stencil_front_op; ///< 0x1384
- u32 stencil_front_ref; ///< 0x1394
- u32 stencil_front_func_mask; ///< 0x1398
- u32 stencil_front_mask; ///< 0x139C
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 draw_auto_start_byte_count; ///< 0x13A4
- PsSaturate frag_color_clamp; ///< 0x13A8
- WindowOrigin window_origin; ///< 0x13AC
- f32 line_width_smooth; ///< 0x13B0
- f32 line_width_aliased; ///< 0x13B4
- INSERT_PADDING_BYTES_NOINIT(0x60);
- u32 line_override_multisample; ///< 0x1418
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 alpha_hysteresis_rounds; ///< 0x1420
- InvalidateCacheLines invalidate_sampler_cache_no_wfi; ///< 0x1424
- InvalidateCacheLines invalidate_texture_header_cache_no_wfi; ///< 0x1428
- INSERT_PADDING_BYTES_NOINIT(0x8);
- u32 global_base_vertex_index; ///< 0x1434
- u32 global_base_instance_index; ///< 0x1438
- INSERT_PADDING_BYTES_NOINIT(0x14);
- RegisterWatermarks ps_warp_watermarks; ///< 0x1450
- RegisterWatermarks ps_regster_watermarks; ///< 0x1454
- INSERT_PADDING_BYTES_NOINIT(0xC);
- u32 store_zcull; ///< 0x1464
- INSERT_PADDING_BYTES_NOINIT(0x18);
- std::array<IteratedBlendConstants, NumRenderTargets>
- iterated_blend_constants; ///< 0x1480
- u32 load_zcull; ///< 0x1500
- u32 surface_clip_id_height; ///< 0x1504
- Window surface_clip_id_clear_rect; ///< 0x1508
- UserClip::Enable user_clip_enable; ///< 0x1510
- u32 zpass_pixel_count_enable; ///< 0x1514
- f32 point_size; ///< 0x1518
- u32 zcull_stats_enable; ///< 0x151C
- u32 point_sprite_enable; ///< 0x1520
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 shader_exceptions_enable; ///< 0x1528
- INSERT_PADDING_BYTES_NOINIT(0x4);
- ClearReport clear_report_value; ///< 0x1530
- u32 anti_alias_enable; ///< 0x1534
- u32 zeta_enable; ///< 0x1538
- AntiAliasAlphaControl anti_alias_alpha_control; ///< 0x153C
- INSERT_PADDING_BYTES_NOINIT(0x10);
- RenderEnable render_enable; ///< 0x1550
- TexSampler tex_sampler; ///< 0x155C
- INSERT_PADDING_BYTES_NOINIT(0x4);
- f32 slope_scale_depth_bias; ///< 0x156C
- u32 line_anti_alias_enable; ///< 0x1570
- TexHeader tex_header; ///< 0x1574
- INSERT_PADDING_BYTES_NOINIT(0x10);
- u32 active_zcull_region_id; ///< 0x1590
- u32 stencil_two_side_enable; ///< 0x1594
- StencilOp stencil_back_op; ///< 0x1598
- INSERT_PADDING_BYTES_NOINIT(0x10);
- u32 framebuffer_srgb; ///< 0x15B8
- f32 depth_bias; ///< 0x15BC
- INSERT_PADDING_BYTES_NOINIT(0x8);
- ZCullRegionFormat zcull_region_format; ///< 0x15C8
- RtLayer rt_layer; ///< 0x15CC
- Tegra::Texture::MsaaMode anti_alias_samples_mode; ///< 0x15D0
- INSERT_PADDING_BYTES_NOINIT(0x10);
- u32 edge_flag; ///< 0x15E4
- u32 draw_inline_index; ///< 0x15E8
- InlineIndex2x16 inline_index_2x16; ///< 0x15EC
- VertexGlobalBaseOffset vertex_global_base_offset; ///< 0x15F4
- ZCullRegionPixelOffset zcull_region_pixel_offset; ///< 0x15FC
- PointSprite point_sprite; ///< 0x1604
- ProgramRegion program_region; ///< 0x1608
- DefaultAttributes default_attributes; ///< 0x1610
- Draw draw; ///< 0x1614
- VertexIdCopy vertex_id_copy; ///< 0x161C
- u32 add_to_primitive_id; ///< 0x1620
- u32 load_to_primitive_id; ///< 0x1624
- INSERT_PADDING_BYTES_NOINIT(0x4);
- ShaderBasedCull shader_based_cull; ///< 0x162C
- INSERT_PADDING_BYTES_NOINIT(0x8);
- ClassVersion class_version; ///< 0x1638
- INSERT_PADDING_BYTES_NOINIT(0x8);
- PrimitiveRestart primitive_restart; ///< 0x1644
- OutputVertexId output_vertex_id; ///< 0x164C
- INSERT_PADDING_BYTES_NOINIT(0x8);
- u32 anti_alias_point_enable; ///< 0x1658
- PointCenterMode point_center_mode; ///< 0x165C
- INSERT_PADDING_BYTES_NOINIT(0x8);
- LineSmoothParams line_smooth_params; ///< 0x1668
- u32 line_stipple_enable; ///< 0x166C
- std::array<LineSmoothEdgeTable, 4> line_smooth_edge_table; ///< 0x1670
- LineStippleParams line_stipple_params; ///< 0x1680
- ProvokingVertex provoking_vertex; ///< 0x1684
- u32 two_sided_light_enabled; ///< 0x1688
- u32 polygon_stipple_enabled; ///< 0x168C
- ShaderControl shader_control; ///< 0x1690
- INSERT_PADDING_BYTES_NOINIT(0xC);
- ClassVersion class_version_check; ///< 0x16A0
- SphVersion sph_version; ///< 0x16A4
- SphVersion sph_version_check; ///< 0x16A8
- INSERT_PADDING_BYTES_NOINIT(0x8);
- AlphaToCoverageOverride alpha_to_coverage_override; ///< 0x16B4
- INSERT_PADDING_BYTES_NOINIT(0x48);
- std::array<u32, 32> polygon_stipple_pattern; ///< 0x1700
- INSERT_PADDING_BYTES_NOINIT(0x10);
- AamVersion aam_version; ///< 0x1790
- AamVersion aam_version_check; ///< 0x1794
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 zeta_layer_offset; ///< 0x179C
- INSERT_PADDING_BYTES_NOINIT(0x28);
- IndexBuffer index_buffer; ///< 0x17C8
- IndexBufferSmall index_buffer32_first; ///< 0x17E4
- IndexBufferSmall index_buffer16_first; ///< 0x17E8
- IndexBufferSmall index_buffer8_first; ///< 0x17EC
- IndexBufferSmall index_buffer32_subsequent; ///< 0x17F0
- IndexBufferSmall index_buffer16_subsequent; ///< 0x17F4
- IndexBufferSmall index_buffer8_subsequent; ///< 0x17F8
- INSERT_PADDING_BYTES_NOINIT(0x80);
- f32 depth_bias_clamp; ///< 0x187C
- VertexStreamInstances vertex_stream_instances; ///< 0x1880
- INSERT_PADDING_BYTES_NOINIT(0x10);
- AttributePointSize point_size_attribute; ///< 0x1910
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 gl_cull_test_enabled; ///< 0x1918
- FrontFace gl_front_face; ///< 0x191C
- CullFace gl_cull_face; ///< 0x1920
- Viewport::PixelCenter viewport_pixel_center; ///< 0x1924
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 viewport_scale_offset_enabled; ///< 0x192C
- INSERT_PADDING_BYTES_NOINIT(0xC);
- ViewportClipControl viewport_clip_control; ///< 0x193C
- UserClip::Op user_clip_op; ///< 0x1940
- RenderEnable::Override render_enable_override; ///< 0x1944
- PrimitiveTopologyControl primitive_topology_control; ///< 0x1948
- WindowClip window_clip_enable; ///< 0x194C
- INSERT_PADDING_BYTES_NOINIT(0x4);
- InvalidateZCull invalidate_zcull; ///< 0x1958
- INSERT_PADDING_BYTES_NOINIT(0xC);
- ZCull zcull; ///< 0x1968
- PrimitiveTopologyOverride topology_override; ///< 0x1970
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 zcull_sync; ///< 0x1978
- u32 clip_id_test_enable; ///< 0x197C
- u32 surface_clip_id_width; ///< 0x1980
- u32 clip_id; ///< 0x1984
- INSERT_PADDING_BYTES_NOINIT(0x34);
- u32 depth_bounds_enable; ///< 0x19BC
- u32 blend_float_zero_times_anything_is_zero; ///< 0x19C0
- LogicOp logic_op; ///< 0x19C4
- u32 z_compression_enable; ///< 0x19CC
- ClearSurface clear_surface; ///< 0x19D0
- u32 clear_clip_id_surface; ///< 0x19D4
- INSERT_PADDING_BYTES_NOINIT(0x8);
- std::array<u32, NumRenderTargets> color_compression_enable; ///< 0x19E0
- std::array<ColorMask, NumRenderTargets> color_mask; ///< 0x1A00
- INSERT_PADDING_BYTES_NOINIT(0xC);
- u32 pipe_nop; ///< 0x1A2C
- std::array<u32, 4> spare; ///< 0x1A30
- INSERT_PADDING_BYTES_NOINIT(0xC0);
- ReportSemaphore report_semaphore; ///< 0x1B00
- INSERT_PADDING_BYTES_NOINIT(0xF0);
- std::array<VertexStream, NumVertexArrays> vertex_streams; ///< 0x1C00
- BlendPerTarget blend_per_target[NumRenderTargets]; ///< 0x1E00
- std::array<VertexStreamLimit, NumVertexArrays> vertex_stream_limits; ///< 0x1F00
- std::array<Pipeline, MaxShaderProgram> pipelines; ///< 0x2000
- INSERT_PADDING_BYTES_NOINIT(0x180);
- u32 falcon[32]; ///< 0x2300
- ConstantBuffer const_buffer; ///< 0x2380
- INSERT_PADDING_BYTES_NOINIT(0x30);
- BindGroup bind_groups[MaxShaderStage]; ///< 0x2400
- INSERT_PADDING_BYTES_NOINIT(0x160);
- u32 color_clamp_enable; ///< 0x2600
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 bindless_texture_const_buffer_slot; ///< 0x2608
- u32 trap_handler; ///< 0x260C
- INSERT_PADDING_BYTES_NOINIT(0x1F0);
- std::array<std::array<StreamOutLayout, 32>, NumTransformFeedbackBuffers>
- stream_out_layout; ///< 0x2800
- INSERT_PADDING_BYTES_NOINIT(0x93C);
- ShaderPerformance shader_performance; ///< 0x333C
- INSERT_PADDING_BYTES_NOINIT(0x18);
- std::array<u32, 0x100> shadow_scratch; ///< 0x3400
- };
- std::array<u32, NUM_REGS> reg_array;
- };
- };
- // clang-format on
- Regs regs{};
- /// Store temporary hw register values, used by some calls to restore state after a operation
- Regs shadow_state;
- // None Engine
- enum class EngineHint : u32 {
- None = 0x0,
- OnHLEMacro = 0x1,
- };
- EngineHint engine_state{EngineHint::None};
- enum class HLEReplaceName : u32 {
- BaseVertex = 0x0,
- BaseInstance = 0x1,
- };
- void setHLEReplacementName(u32 bank, u32 offset, HLEReplaceName name);
- std::unordered_map<u64, HLEReplaceName> replace_table;
- static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), "Maxwell3D Regs has wrong size");
- static_assert(std::is_trivially_copyable_v<Regs>, "Maxwell3D Regs must be trivially copyable");
- struct State {
- struct ShaderStageInfo {
- std::array<ConstBufferInfo, Regs::MaxConstBuffers> const_buffers;
- };
- std::array<ShaderStageInfo, Regs::MaxShaderStage> shader_stages;
- };
- State state{};
- /// Reads a register value located at the input method address
- u32 GetRegisterValue(u32 method) const;
- /// Write the value to the register identified by method.
- void CallMethod(u32 method, u32 method_argument, bool is_last_call) override;
- /// Write multiple values to the register identified by method.
- void CallMultiMethod(u32 method, const u32* base_start, u32 amount,
- u32 methods_pending) override;
- bool ShouldExecute() const {
- return execute_on;
- }
- VideoCore::RasterizerInterface& Rasterizer() {
- return *rasterizer;
- }
- const VideoCore::RasterizerInterface& Rasterizer() const {
- return *rasterizer;
- }
- struct DirtyState {
- using Flags = std::bitset<std::numeric_limits<u8>::max()>;
- using Table = std::array<u8, Regs::NUM_REGS>;
- using Tables = std::array<Table, 2>;
- Flags flags;
- Tables tables{};
- } dirty;
- std::unique_ptr<DrawManager> draw_manager;
- friend class DrawManager;
- std::vector<u8> inline_index_draw_indexes;
- GPUVAddr getMacroAddress(size_t index) const {
- return macro_addresses[index];
- }
- void RefreshParameters() {
- if (!current_macro_dirty) {
- return;
- }
- RefreshParametersImpl();
- }
- bool AnyParametersDirty() {
- return current_macro_dirty;
- }
- u32 GetMaxCurrentVertices();
- size_t EstimateIndexBufferSize();
- /// Handles a write to the CLEAR_BUFFERS register.
- void ProcessClearBuffers(u32 layer_count);
- /// Handles a write to the CB_BIND register.
- void ProcessCBBind(size_t stage_index);
- private:
- void InitializeRegisterDefaults();
- void ProcessMacro(u32 method, const u32* base_start, u32 amount, bool is_last_call);
- u32 ProcessShadowRam(u32 method, u32 argument);
- void ProcessDirtyRegisters(u32 method, u32 argument);
- void ConsumeSinkImpl() override;
- void ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argument, bool is_last_call);
- /// Retrieves information about a specific TIC entry from the TIC buffer.
- Texture::TICEntry GetTICEntry(u32 tic_index) const;
- /// Retrieves information about a specific TSC entry from the TSC buffer.
- Texture::TSCEntry GetTSCEntry(u32 tsc_index) const;
- /**
- * Call a macro on this engine.
- *
- * @param method Method to call
- * @param parameters Arguments to the method call
- */
- void CallMacroMethod(u32 method, const std::vector<u32>& parameters);
- /// Handles writes to the macro uploading register.
- void ProcessMacroUpload(u32 data);
- /// Handles writes to the macro bind register.
- void ProcessMacroBind(u32 data);
- /// Handles firmware blob 4
- void ProcessFirmwareCall4();
- /// Handles a write to the QUERY_GET register.
- void ProcessQueryGet();
- /// Writes the query result accordingly.
- void StampQueryResult(u64 payload, bool long_query);
- /// Handles conditional rendering.
- void ProcessQueryCondition();
- /// Handles counter resets.
- void ProcessCounterReset();
- /// Handles writes to syncing register.
- void ProcessSyncPoint();
- /// Handles a write to the CB_DATA[i] register.
- void ProcessCBData(u32 value);
- void ProcessCBMultiData(const u32* start_base, u32 amount);
- /// Returns a query's value or an empty object if the value will be deferred through a cache.
- std::optional<u64> GetQueryResult();
- void RefreshParametersImpl();
- bool IsMethodExecutable(u32 method);
- Core::System& system;
- MemoryManager& memory_manager;
- VideoCore::RasterizerInterface* rasterizer = nullptr;
- /// Start offsets of each macro in macro_memory
- std::array<u32, 0x80> macro_positions{};
- /// Macro method that is currently being executed / being fed parameters.
- u32 executing_macro = 0;
- /// Parameters that have been submitted to the macro call so far.
- std::vector<u32> macro_params;
- /// Interpreter for the macro codes uploaded to the GPU.
- std::unique_ptr<MacroEngine> macro_engine;
- Upload::State upload_state;
- bool execute_on{true};
- std::array<bool, Regs::NUM_REGS> draw_command{};
- std::vector<u32> deferred_draw_method;
- enum class DrawMode : u32 { General = 0, Instance, InlineIndex };
- DrawMode draw_mode{DrawMode::General};
- bool draw_indexed{};
- std::vector<std::pair<GPUVAddr, size_t>> macro_segments;
- std::vector<GPUVAddr> macro_addresses;
- bool current_macro_dirty{};
- };
- #define ASSERT_REG_POSITION(field_name, position) \
- static_assert(offsetof(Maxwell3D::Regs, field_name) == position, \
- "Field " #field_name " has invalid position")
- ASSERT_REG_POSITION(object_id, 0x0000);
- ASSERT_REG_POSITION(nop, 0x0100);
- ASSERT_REG_POSITION(notify, 0x0104);
- ASSERT_REG_POSITION(wait_for_idle, 0x0110);
- ASSERT_REG_POSITION(load_mme, 0x0114);
- ASSERT_REG_POSITION(shadow_ram_control, 0x0124);
- ASSERT_REG_POSITION(peer, 0x0128);
- ASSERT_REG_POSITION(global_render, 0x0130);
- ASSERT_REG_POSITION(go_idle, 0x013C);
- ASSERT_REG_POSITION(trigger, 0x0140);
- ASSERT_REG_POSITION(trigger_wfi, 0x0144);
- ASSERT_REG_POSITION(instrumentation_method_header, 0x0150);
- ASSERT_REG_POSITION(instrumentation_method_data, 0x0154);
- ASSERT_REG_POSITION(upload, 0x0180);
- ASSERT_REG_POSITION(launch_dma, 0x01B0);
- ASSERT_REG_POSITION(inline_data, 0x01B4);
- ASSERT_REG_POSITION(i2m, 0x01DC);
- ASSERT_REG_POSITION(run_ds_now, 0x0200);
- ASSERT_REG_POSITION(opportunistic_early_z, 0x0204);
- ASSERT_REG_POSITION(aliased_line_width_enabled, 0x020C);
- ASSERT_REG_POSITION(mandated_early_z, 0x0210);
- ASSERT_REG_POSITION(gs_dm_fifo, 0x0214);
- ASSERT_REG_POSITION(l2_cache_control, 0x0218);
- ASSERT_REG_POSITION(invalidate_shader_cache, 0x021C);
- ASSERT_REG_POSITION(sync_info, 0x02C8);
- ASSERT_REG_POSITION(prim_circular_buffer_throttle, 0x02D0);
- ASSERT_REG_POSITION(flush_invalidate_rop_mini_cache, 0x02D4);
- ASSERT_REG_POSITION(surface_clip_block_id, 0x02D8);
- ASSERT_REG_POSITION(alpha_circular_buffer_size, 0x02DC);
- ASSERT_REG_POSITION(decompress_surface, 0x02E0);
- ASSERT_REG_POSITION(zcull_rop_bypass, 0x02E4);
- ASSERT_REG_POSITION(zcull_subregion, 0x02E8);
- ASSERT_REG_POSITION(raster_bounding_box, 0x02EC);
- ASSERT_REG_POSITION(peer_semaphore_release, 0x02F0);
- ASSERT_REG_POSITION(iterated_blend_optimization, 0x02F4);
- ASSERT_REG_POSITION(zcull_subregion_allocation, 0x02F8);
- ASSERT_REG_POSITION(zcull_subregion_algorithm, 0x02FC);
- ASSERT_REG_POSITION(ps_output_sample_mask_usage, 0x0300);
- ASSERT_REG_POSITION(draw_zero_index, 0x0304);
- ASSERT_REG_POSITION(l1_configuration, 0x0308);
- ASSERT_REG_POSITION(render_enable_control_load_const_buffer, 0x030C);
- ASSERT_REG_POSITION(spa_version, 0x0310);
- ASSERT_REG_POSITION(ieee_clean_update, 0x0314);
- ASSERT_REG_POSITION(snap_grid, 0x0318);
- ASSERT_REG_POSITION(tessellation, 0x0320);
- ASSERT_REG_POSITION(sub_tiling_perf, 0x0360);
- ASSERT_REG_POSITION(zcull_subregion_report, 0x036C);
- ASSERT_REG_POSITION(balanced_primitive_workload, 0x0374);
- ASSERT_REG_POSITION(max_patches_per_batch, 0x0378);
- ASSERT_REG_POSITION(rasterize_enable, 0x037C);
- ASSERT_REG_POSITION(transform_feedback, 0x0380);
- ASSERT_REG_POSITION(transform_feedback.controls, 0x0700);
- ASSERT_REG_POSITION(raster_input, 0x0740);
- ASSERT_REG_POSITION(transform_feedback_enabled, 0x0744);
- ASSERT_REG_POSITION(primitive_restart_topology_change_enable, 0x0748);
- ASSERT_REG_POSITION(alpha_fraction, 0x074C);
- ASSERT_REG_POSITION(hybrid_aa_control, 0x0754);
- ASSERT_REG_POSITION(shader_local_memory, 0x077C);
- ASSERT_REG_POSITION(color_zero_bandwidth_clear, 0x07A4);
- ASSERT_REG_POSITION(z_zero_bandwidth_clear, 0x07A8);
- ASSERT_REG_POSITION(isbe_save_restore_program_offset, 0x07AC);
- ASSERT_REG_POSITION(zcull_region, 0x07C0);
- ASSERT_REG_POSITION(zeta_read_only, 0x07F8);
- ASSERT_REG_POSITION(rt, 0x0800);
- ASSERT_REG_POSITION(viewport_transform, 0x0A00);
- ASSERT_REG_POSITION(viewports, 0x0C00);
- ASSERT_REG_POSITION(windows, 0x0D00);
- ASSERT_REG_POSITION(clip_id_extent, 0x0D40);
- ASSERT_REG_POSITION(max_geometry_instances_per_task, 0x0D60);
- ASSERT_REG_POSITION(visible_call_limit, 0x0D64);
- ASSERT_REG_POSITION(statistics_count, 0x0D68);
- ASSERT_REG_POSITION(clear_rect, 0x0D6C);
- ASSERT_REG_POSITION(vertex_buffer, 0x0D74);
- ASSERT_REG_POSITION(depth_mode, 0x0D7C);
- ASSERT_REG_POSITION(clear_color, 0x0D80);
- ASSERT_REG_POSITION(clear_depth, 0x0D90);
- ASSERT_REG_POSITION(shader_cache_icache_prefetch, 0x0D94);
- ASSERT_REG_POSITION(force_transition_to_beta, 0x0D98);
- ASSERT_REG_POSITION(reduce_colour_thresholds, 0x0D9C);
- ASSERT_REG_POSITION(clear_stencil, 0x0DA0);
- ASSERT_REG_POSITION(invalidate_shader_cache_no_wfi, 0x0DA4);
- ASSERT_REG_POSITION(zcull_serialization, 0x0DA8);
- ASSERT_REG_POSITION(polygon_mode_front, 0x0DAC);
- ASSERT_REG_POSITION(polygon_mode_back, 0x0DB0);
- ASSERT_REG_POSITION(polygon_smooth, 0x0DB4);
- ASSERT_REG_POSITION(zeta_mark_clean_ieee, 0x0DB8);
- ASSERT_REG_POSITION(zcull_dir_format, 0x0DBC);
- ASSERT_REG_POSITION(polygon_offset_point_enable, 0x0DC0);
- ASSERT_REG_POSITION(polygon_offset_line_enable, 0x0DC4);
- ASSERT_REG_POSITION(polygon_offset_fill_enable, 0x0DC8);
- ASSERT_REG_POSITION(patch_vertices, 0x0DCC);
- ASSERT_REG_POSITION(iterated_blend, 0x0DD0);
- ASSERT_REG_POSITION(zcull_criteria, 0x0DD8);
- ASSERT_REG_POSITION(fragment_barrier, 0x0DE0);
- ASSERT_REG_POSITION(sm_timeout, 0x0DE4);
- ASSERT_REG_POSITION(primitive_restart_array, 0x0DE8);
- ASSERT_REG_POSITION(load_iterated_blend, 0x0DF0);
- ASSERT_REG_POSITION(window_offset_x, 0x0DF8);
- ASSERT_REG_POSITION(window_offset_y, 0x0DFC);
- ASSERT_REG_POSITION(scissor_test, 0x0E00);
- ASSERT_REG_POSITION(select_texture_headers, 0x0F10);
- ASSERT_REG_POSITION(vpc_perf, 0x0F14);
- ASSERT_REG_POSITION(pm_local_trigger, 0x0F18);
- ASSERT_REG_POSITION(post_z_pixel_imask, 0x0F1C);
- ASSERT_REG_POSITION(const_color_rendering, 0x0F40);
- ASSERT_REG_POSITION(stencil_back_ref, 0x0F54);
- ASSERT_REG_POSITION(stencil_back_mask, 0x0F58);
- ASSERT_REG_POSITION(stencil_back_func_mask, 0x0F5C);
- ASSERT_REG_POSITION(invalidate_texture_data_cache, 0x0F74);
- ASSERT_REG_POSITION(tiled_cache_barrier, 0x0F7C);
- ASSERT_REG_POSITION(vertex_stream_substitute, 0x0F84);
- ASSERT_REG_POSITION(line_mode_clip_generated_edge_do_not_draw, 0x0F8C);
- ASSERT_REG_POSITION(color_mask_common, 0x0F90);
- ASSERT_REG_POSITION(vtg_warp_watermarks, 0x0F98);
- ASSERT_REG_POSITION(depth_bounds, 0x0F9C);
- ASSERT_REG_POSITION(sample_mask_target, 0x0FA4);
- ASSERT_REG_POSITION(color_target_mrt_enable, 0x0FAC);
- ASSERT_REG_POSITION(non_multisampled_z, 0x0FB0);
- ASSERT_REG_POSITION(tir_mode, 0x0FB4);
- ASSERT_REG_POSITION(anti_alias_raster, 0x0FB8);
- ASSERT_REG_POSITION(sample_mask_pos, 0x0FBC);
- ASSERT_REG_POSITION(surface_clip_id_memory, 0x0FCC);
- ASSERT_REG_POSITION(tir_modulation, 0x0FD4);
- ASSERT_REG_POSITION(blend_control_allow_float_pixel_kills, 0x0FDC);
- ASSERT_REG_POSITION(zeta, 0x0FE0);
- ASSERT_REG_POSITION(surface_clip, 0x0FF4);
- ASSERT_REG_POSITION(tiled_cache_treat_heavy_as_light, 0x0FFC);
- ASSERT_REG_POSITION(l2_cache_vaf, 0x1000);
- ASSERT_REG_POSITION(viewport_multicast, 0x1004);
- ASSERT_REG_POSITION(tessellation_cut_height, 0x1008);
- ASSERT_REG_POSITION(max_gs_instances_per_task, 0x100C);
- ASSERT_REG_POSITION(max_gs_output_vertices_per_task, 0x1010);
- ASSERT_REG_POSITION(reserved_sw_method0, 0x1014);
- ASSERT_REG_POSITION(gs_output_cb_storage_multiplier, 0x1018);
- ASSERT_REG_POSITION(beta_cb_storage_constant, 0x101C);
- ASSERT_REG_POSITION(ti_output_cb_storage_multiplier, 0x1020);
- ASSERT_REG_POSITION(alpha_cb_storage_constraint, 0x1024);
- ASSERT_REG_POSITION(reserved_sw_method1, 0x1028);
- ASSERT_REG_POSITION(reserved_sw_method2, 0x102C);
- ASSERT_REG_POSITION(tir_modulation_coeff, 0x1030);
- ASSERT_REG_POSITION(spare_nop, 0x1044);
- ASSERT_REG_POSITION(reserved_sw_method3_to_7, 0x10B0);
- ASSERT_REG_POSITION(reduce_color_thresholds_unorm8, 0x10CC);
- ASSERT_REG_POSITION(reserved_sw_method10_to_13, 0x10D0);
- ASSERT_REG_POSITION(reduce_color_thresholds_unorm10, 0x10E0);
- ASSERT_REG_POSITION(reduce_color_thresholds_unorm16, 0x10E4);
- ASSERT_REG_POSITION(reduce_color_thresholds_fp11, 0x10E8);
- ASSERT_REG_POSITION(reduce_color_thresholds_fp16, 0x10EC);
- ASSERT_REG_POSITION(reduce_color_thresholds_srgb8, 0x10F0);
- ASSERT_REG_POSITION(unbind_all_constant_buffers, 0x10F4);
- ASSERT_REG_POSITION(clear_control, 0x10F8);
- ASSERT_REG_POSITION(l2_cache_rop_non_interlocked_reads, 0x10FC);
- ASSERT_REG_POSITION(reserved_sw_method14, 0x1100);
- ASSERT_REG_POSITION(reserved_sw_method15, 0x1104);
- ASSERT_REG_POSITION(no_operation_data_high, 0x110C);
- ASSERT_REG_POSITION(depth_bias_control, 0x1110);
- ASSERT_REG_POSITION(pm_trigger_end, 0x1114);
- ASSERT_REG_POSITION(vertex_id_base, 0x1118);
- ASSERT_REG_POSITION(stencil_compression_enabled, 0x111C);
- ASSERT_REG_POSITION(vertex_output_attribute_skip_masks, 0x1120);
- ASSERT_REG_POSITION(tir_control, 0x1130);
- ASSERT_REG_POSITION(mutable_method_treat_mutable_as_heavy, 0x1134);
- ASSERT_REG_POSITION(post_ps_use_pre_ps_coverage, 0x1138);
- ASSERT_REG_POSITION(fill_via_triangle_mode, 0x113C);
- ASSERT_REG_POSITION(blend_per_format_snorm8_unorm16_snorm16_enabled, 0x1140);
- ASSERT_REG_POSITION(flush_pending_writes_sm_gloal_store, 0x1144);
- ASSERT_REG_POSITION(conservative_raster_enable, 0x1148);
- ASSERT_REG_POSITION(vertex_attrib_format, 0x1160);
- ASSERT_REG_POSITION(multisample_sample_locations, 0x11E0);
- ASSERT_REG_POSITION(offset_render_target_index_by_viewport_index, 0x11F0);
- ASSERT_REG_POSITION(force_heavy_method_sync, 0x11F4);
- ASSERT_REG_POSITION(multisample_coverage_to_color, 0x11F8);
- ASSERT_REG_POSITION(decompress_zeta_surface, 0x11FC);
- ASSERT_REG_POSITION(zeta_sparse, 0x1208);
- ASSERT_REG_POSITION(invalidate_sampler_cache, 0x120C);
- ASSERT_REG_POSITION(invalidate_texture_header_cache, 0x1210);
- ASSERT_REG_POSITION(vertex_array_instance_first, 0x1214);
- ASSERT_REG_POSITION(vertex_array_instance_subsequent, 0x1218);
- ASSERT_REG_POSITION(rt_control, 0x121C);
- ASSERT_REG_POSITION(compression_threshold_samples, 0x1220);
- ASSERT_REG_POSITION(ps_interlock_control, 0x1224);
- ASSERT_REG_POSITION(zeta_size, 0x1228);
- ASSERT_REG_POSITION(sampler_binding, 0x1234);
- ASSERT_REG_POSITION(draw_auto_byte_count, 0x123C);
- ASSERT_REG_POSITION(post_vtg_shader_attrib_skip_mask, 0x1240);
- ASSERT_REG_POSITION(ps_ticket_dispenser_value, 0x1260);
- ASSERT_REG_POSITION(circular_buffer_size, 0x1280);
- ASSERT_REG_POSITION(vtg_register_watermarks, 0x1284);
- ASSERT_REG_POSITION(invalidate_texture_cache_no_wfi, 0x1288);
- ASSERT_REG_POSITION(l2_cache_rop_interlocked_reads, 0x1290);
- ASSERT_REG_POSITION(primitive_restart_topology_change_index, 0x12A4);
- ASSERT_REG_POSITION(zcull_region_enable, 0x12C8);
- ASSERT_REG_POSITION(depth_test_enable, 0x12CC);
- ASSERT_REG_POSITION(fill_mode, 0x12D0);
- ASSERT_REG_POSITION(shade_mode, 0x12D4);
- ASSERT_REG_POSITION(l2_cache_rop_non_interlocked_writes, 0x12D8);
- ASSERT_REG_POSITION(l2_cache_rop_interlocked_writes, 0x12DC);
- ASSERT_REG_POSITION(alpha_to_coverage_dither, 0x12E0);
- ASSERT_REG_POSITION(blend_per_target_enabled, 0x12E4);
- ASSERT_REG_POSITION(depth_write_enabled, 0x12E8);
- ASSERT_REG_POSITION(alpha_test_enabled, 0x12EC);
- ASSERT_REG_POSITION(inline_index_4x8, 0x1300);
- ASSERT_REG_POSITION(d3d_cull_mode, 0x1308);
- ASSERT_REG_POSITION(depth_test_func, 0x130C);
- ASSERT_REG_POSITION(alpha_test_ref, 0x1310);
- ASSERT_REG_POSITION(alpha_test_func, 0x1314);
- ASSERT_REG_POSITION(draw_auto_stride, 0x1318);
- ASSERT_REG_POSITION(blend_color, 0x131C);
- ASSERT_REG_POSITION(invalidate_sampler_cache_lines, 0x1330);
- ASSERT_REG_POSITION(invalidate_texture_header_cache_lines, 0x1334);
- ASSERT_REG_POSITION(invalidate_texture_data_cache_lines, 0x1338);
- ASSERT_REG_POSITION(blend, 0x133C);
- ASSERT_REG_POSITION(stencil_enable, 0x1380);
- ASSERT_REG_POSITION(stencil_front_op, 0x1384);
- ASSERT_REG_POSITION(stencil_front_ref, 0x1394);
- ASSERT_REG_POSITION(stencil_front_func_mask, 0x1398);
- ASSERT_REG_POSITION(stencil_front_mask, 0x139C);
- ASSERT_REG_POSITION(draw_auto_start_byte_count, 0x13A4);
- ASSERT_REG_POSITION(frag_color_clamp, 0x13A8);
- ASSERT_REG_POSITION(window_origin, 0x13AC);
- ASSERT_REG_POSITION(line_width_smooth, 0x13B0);
- ASSERT_REG_POSITION(line_width_aliased, 0x13B4);
- ASSERT_REG_POSITION(line_override_multisample, 0x1418);
- ASSERT_REG_POSITION(alpha_hysteresis_rounds, 0x1420);
- ASSERT_REG_POSITION(invalidate_sampler_cache_no_wfi, 0x1424);
- ASSERT_REG_POSITION(invalidate_texture_header_cache_no_wfi, 0x1428);
- ASSERT_REG_POSITION(global_base_vertex_index, 0x1434);
- ASSERT_REG_POSITION(global_base_instance_index, 0x1438);
- ASSERT_REG_POSITION(ps_warp_watermarks, 0x1450);
- ASSERT_REG_POSITION(ps_regster_watermarks, 0x1454);
- ASSERT_REG_POSITION(store_zcull, 0x1464);
- ASSERT_REG_POSITION(iterated_blend_constants, 0x1480);
- ASSERT_REG_POSITION(load_zcull, 0x1500);
- ASSERT_REG_POSITION(surface_clip_id_height, 0x1504);
- ASSERT_REG_POSITION(surface_clip_id_clear_rect, 0x1508);
- ASSERT_REG_POSITION(user_clip_enable, 0x1510);
- ASSERT_REG_POSITION(zpass_pixel_count_enable, 0x1514);
- ASSERT_REG_POSITION(point_size, 0x1518);
- ASSERT_REG_POSITION(zcull_stats_enable, 0x151C);
- ASSERT_REG_POSITION(point_sprite_enable, 0x1520);
- ASSERT_REG_POSITION(shader_exceptions_enable, 0x1528);
- ASSERT_REG_POSITION(clear_report_value, 0x1530);
- ASSERT_REG_POSITION(anti_alias_enable, 0x1534);
- ASSERT_REG_POSITION(zeta_enable, 0x1538);
- ASSERT_REG_POSITION(anti_alias_alpha_control, 0x153C);
- ASSERT_REG_POSITION(render_enable, 0x1550);
- ASSERT_REG_POSITION(tex_sampler, 0x155C);
- ASSERT_REG_POSITION(slope_scale_depth_bias, 0x156C);
- ASSERT_REG_POSITION(line_anti_alias_enable, 0x1570);
- ASSERT_REG_POSITION(tex_header, 0x1574);
- ASSERT_REG_POSITION(active_zcull_region_id, 0x1590);
- ASSERT_REG_POSITION(stencil_two_side_enable, 0x1594);
- ASSERT_REG_POSITION(stencil_back_op, 0x1598);
- ASSERT_REG_POSITION(framebuffer_srgb, 0x15B8);
- ASSERT_REG_POSITION(depth_bias, 0x15BC);
- ASSERT_REG_POSITION(zcull_region_format, 0x15C8);
- ASSERT_REG_POSITION(rt_layer, 0x15CC);
- ASSERT_REG_POSITION(anti_alias_samples_mode, 0x15D0);
- ASSERT_REG_POSITION(edge_flag, 0x15E4);
- ASSERT_REG_POSITION(draw_inline_index, 0x15E8);
- ASSERT_REG_POSITION(inline_index_2x16, 0x15EC);
- ASSERT_REG_POSITION(vertex_global_base_offset, 0x15F4);
- ASSERT_REG_POSITION(zcull_region_pixel_offset, 0x15FC);
- ASSERT_REG_POSITION(point_sprite, 0x1604);
- ASSERT_REG_POSITION(program_region, 0x1608);
- ASSERT_REG_POSITION(default_attributes, 0x1610);
- ASSERT_REG_POSITION(draw, 0x1614);
- ASSERT_REG_POSITION(vertex_id_copy, 0x161C);
- ASSERT_REG_POSITION(add_to_primitive_id, 0x1620);
- ASSERT_REG_POSITION(load_to_primitive_id, 0x1624);
- ASSERT_REG_POSITION(shader_based_cull, 0x162C);
- ASSERT_REG_POSITION(class_version, 0x1638);
- ASSERT_REG_POSITION(primitive_restart, 0x1644);
- ASSERT_REG_POSITION(output_vertex_id, 0x164C);
- ASSERT_REG_POSITION(anti_alias_point_enable, 0x1658);
- ASSERT_REG_POSITION(point_center_mode, 0x165C);
- ASSERT_REG_POSITION(line_smooth_params, 0x1668);
- ASSERT_REG_POSITION(line_stipple_enable, 0x166C);
- ASSERT_REG_POSITION(line_smooth_edge_table, 0x1670);
- ASSERT_REG_POSITION(line_stipple_params, 0x1680);
- ASSERT_REG_POSITION(provoking_vertex, 0x1684);
- ASSERT_REG_POSITION(two_sided_light_enabled, 0x1688);
- ASSERT_REG_POSITION(polygon_stipple_enabled, 0x168C);
- ASSERT_REG_POSITION(shader_control, 0x1690);
- ASSERT_REG_POSITION(class_version_check, 0x16A0);
- ASSERT_REG_POSITION(sph_version, 0x16A4);
- ASSERT_REG_POSITION(sph_version_check, 0x16A8);
- ASSERT_REG_POSITION(alpha_to_coverage_override, 0x16B4);
- ASSERT_REG_POSITION(polygon_stipple_pattern, 0x1700);
- ASSERT_REG_POSITION(aam_version, 0x1790);
- ASSERT_REG_POSITION(aam_version_check, 0x1794);
- ASSERT_REG_POSITION(zeta_layer_offset, 0x179C);
- ASSERT_REG_POSITION(index_buffer, 0x17C8);
- ASSERT_REG_POSITION(index_buffer32_first, 0x17E4);
- ASSERT_REG_POSITION(index_buffer16_first, 0x17E8);
- ASSERT_REG_POSITION(index_buffer8_first, 0x17EC);
- ASSERT_REG_POSITION(index_buffer32_subsequent, 0x17F0);
- ASSERT_REG_POSITION(index_buffer16_subsequent, 0x17F4);
- ASSERT_REG_POSITION(index_buffer8_subsequent, 0x17F8);
- ASSERT_REG_POSITION(depth_bias_clamp, 0x187C);
- ASSERT_REG_POSITION(vertex_stream_instances, 0x1880);
- ASSERT_REG_POSITION(point_size_attribute, 0x1910);
- ASSERT_REG_POSITION(gl_cull_test_enabled, 0x1918);
- ASSERT_REG_POSITION(gl_front_face, 0x191C);
- ASSERT_REG_POSITION(gl_cull_face, 0x1920);
- ASSERT_REG_POSITION(viewport_pixel_center, 0x1924);
- ASSERT_REG_POSITION(viewport_scale_offset_enabled, 0x192C);
- ASSERT_REG_POSITION(viewport_clip_control, 0x193C);
- ASSERT_REG_POSITION(user_clip_op, 0x1940);
- ASSERT_REG_POSITION(render_enable_override, 0x1944);
- ASSERT_REG_POSITION(primitive_topology_control, 0x1948);
- ASSERT_REG_POSITION(window_clip_enable, 0x194C);
- ASSERT_REG_POSITION(invalidate_zcull, 0x1958);
- ASSERT_REG_POSITION(zcull, 0x1968);
- ASSERT_REG_POSITION(topology_override, 0x1970);
- ASSERT_REG_POSITION(zcull_sync, 0x1978);
- ASSERT_REG_POSITION(clip_id_test_enable, 0x197C);
- ASSERT_REG_POSITION(surface_clip_id_width, 0x1980);
- ASSERT_REG_POSITION(clip_id, 0x1984);
- ASSERT_REG_POSITION(depth_bounds_enable, 0x19BC);
- ASSERT_REG_POSITION(blend_float_zero_times_anything_is_zero, 0x19C0);
- ASSERT_REG_POSITION(logic_op, 0x19C4);
- ASSERT_REG_POSITION(z_compression_enable, 0x19CC);
- ASSERT_REG_POSITION(clear_surface, 0x19D0);
- ASSERT_REG_POSITION(clear_clip_id_surface, 0x19D4);
- ASSERT_REG_POSITION(color_compression_enable, 0x19E0);
- ASSERT_REG_POSITION(color_mask, 0x1A00);
- ASSERT_REG_POSITION(pipe_nop, 0x1A2C);
- ASSERT_REG_POSITION(spare, 0x1A30);
- ASSERT_REG_POSITION(report_semaphore, 0x1B00);
- ASSERT_REG_POSITION(vertex_streams, 0x1C00);
- ASSERT_REG_POSITION(blend_per_target, 0x1E00);
- ASSERT_REG_POSITION(vertex_stream_limits, 0x1F00);
- ASSERT_REG_POSITION(pipelines, 0x2000);
- ASSERT_REG_POSITION(falcon, 0x2300);
- ASSERT_REG_POSITION(const_buffer, 0x2380);
- ASSERT_REG_POSITION(bind_groups, 0x2400);
- ASSERT_REG_POSITION(color_clamp_enable, 0x2600);
- ASSERT_REG_POSITION(bindless_texture_const_buffer_slot, 0x2608);
- ASSERT_REG_POSITION(trap_handler, 0x260C);
- ASSERT_REG_POSITION(stream_out_layout, 0x2800);
- ASSERT_REG_POSITION(shader_performance, 0x333C);
- ASSERT_REG_POSITION(shadow_scratch, 0x3400);
- #undef ASSERT_REG_POSITION
- } // namespace Tegra::Engines
|