1aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson/* 2aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 3aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * 4aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * Permission is hereby granted, free of charge, to any person obtaining a 5aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * copy of this software and associated documentation files (the "Software"), 6aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * to deal in the Software without restriction, including without limitation 7aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * on the rights to use, copy, modify, merge, publish, distribute, sub 8aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * license, and/or sell copies of the Software, and to permit persons to whom 9aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * the Software is furnished to do so, subject to the following conditions: 10aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * 11aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * The above copyright notice and this permission notice (including the next 12aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * paragraph) shall be included in all copies or substantial portions of the 13aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * Software. 14aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * 15aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 22aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson 23aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson#ifndef R300_CONTEXT_H 24aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson#define R300_CONTEXT_H 25aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson 26224d0e4a3ffee9df46b5340ed236f2d48eeb0778Marek Olšák#define R300_BUFFER_ALIGNMENT 64 27224d0e4a3ffee9df46b5340ed236f2d48eeb0778Marek Olšák 28e511110b71a7ea19c531d707080813d9d432341cCorbin Simpson#include "draw/draw_vertex.h" 29a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson 3038a97148bf5df3c32087a5fdd799912d0275267dMarek Olšák#include "util/u_blitter.h" 3138a97148bf5df3c32087a5fdd799912d0275267dMarek Olšák 323b37cb49b821dd0c59fd5361ada6c0df9ac07db8Corbin Simpson#include "pipe/p_context.h" 3328486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "util/u_transfer.h" 35028459b0bf2bb778b55493f9b23ab7f2c9b355a0Marek Olšák 36d0d3abd360a0d98302841e62ab9acdebea2ca8c2Marek Olšák#include "r300_defines.h" 3708edbe9f14712f719f838769c61123f83768af76Marek Olšák#include "r300_screen.h" 38886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard#include "compiler/radeon_regalloc.h" 3908edbe9f14712f719f838769c61123f83768af76Marek Olšák 4068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airliestruct u_upload_mgr; 41d496399156a7d9a683999e41f126232f89375f2bCorbin Simpsonstruct r300_context; 42d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnlestruct r300_fragment_shader; 43188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnlestruct r300_vertex_shader; 4476034aaf655134c71e1ec619085c46251d037720Marek Olšákstruct r300_stencilref_context; 45188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnle 461e51d368eb5360378218217ff35731896f48512fMarek Olšákenum colormask_swizzle { 471e51d368eb5360378218217ff35731896f48512fMarek Olšák COLORMASK_BGRA, 481e51d368eb5360378218217ff35731896f48512fMarek Olšák COLORMASK_RGBA, 491e51d368eb5360378218217ff35731896f48512fMarek Olšák COLORMASK_RRRR, 501e51d368eb5360378218217ff35731896f48512fMarek Olšák COLORMASK_AAAA, 511e51d368eb5360378218217ff35731896f48512fMarek Olšák COLORMASK_GRRG, 521e51d368eb5360378218217ff35731896f48512fMarek Olšák COLORMASK_ARRA, 53499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák COLORMASK_BGRX, 54499f7de12e3484f75d30dd314b00c76cb37d8d9fMarek Olšák COLORMASK_RGBX, 551e51d368eb5360378218217ff35731896f48512fMarek Olšák COLORMASK_NUM_SWIZZLES 561e51d368eb5360378218217ff35731896f48512fMarek Olšák}; 571e51d368eb5360378218217ff35731896f48512fMarek Olšák 58d496399156a7d9a683999e41f126232f89375f2bCorbin Simpsonstruct r300_atom { 59aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson /* Name, for debugging. */ 60aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson const char* name; 61aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson /* Opaque state. */ 62d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson void* state; 63aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson /* Emit the state to the context. */ 64841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák void (*emit)(struct r300_context*, unsigned, void*); 65aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson /* Upper bound on number of dwords to emit. */ 66aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson unsigned size; 67aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson /* Whether this atom should be emitted. */ 68d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson boolean dirty; 6995ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák /* Whether this atom may be emitted with state == NULL. */ 7095ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák boolean allow_null_state; 71d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson}; 72d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson 7369adebf5945d994485c584c183c148fc2c1373edMarek Olšákstruct r300_aa_state { 7469adebf5945d994485c584c183c148fc2c1373edMarek Olšák struct r300_surface *dest; 7569adebf5945d994485c584c183c148fc2c1373edMarek Olšák 7669adebf5945d994485c584c183c148fc2c1373edMarek Olšák uint32_t aa_config; 7769adebf5945d994485c584c183c148fc2c1373edMarek Olšák}; 7869adebf5945d994485c584c183c148fc2c1373edMarek Olšák 7974288078eab1971cc6ce3ae00fa55eb917b5826aCorbin Simpsonstruct r300_blend_state { 804b92c688a45480027390764b06077105298666c3Marek Olšák struct pipe_blend_state state; 814b92c688a45480027390764b06077105298666c3Marek Olšák 821e51d368eb5360378218217ff35731896f48512fMarek Olšák uint32_t cb_clamp[COLORMASK_NUM_SWIZZLES][8]; 8323ccab39cd6b89efd8be238c3061e7ddb3697a55Marek Olšák uint32_t cb_noclamp[8]; 844dc142d521f9161275deb030efcde112f835307cMarek Olšák uint32_t cb_noclamp_noalpha[8]; 85cd891648d45189555bace1bca6b7cddef5857f02Marek Olšák uint32_t cb_no_readwrite[8]; 8674288078eab1971cc6ce3ae00fa55eb917b5826aCorbin Simpson}; 8774288078eab1971cc6ce3ae00fa55eb917b5826aCorbin Simpson 88f3b53a5cb6a04b86ccd75cc38c73c8e3dd117894Corbin Simpsonstruct r300_blend_color_state { 89910bac63dfc5c6d9bf7162388c951784eba534f6Marek Olšák struct pipe_blend_color state; 909dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák uint32_t cb[3]; 91f3b53a5cb6a04b86ccd75cc38c73c8e3dd117894Corbin Simpson}; 92f3b53a5cb6a04b86ccd75cc38c73c8e3dd117894Corbin Simpson 93f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšákstruct r300_clip_state { 94f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák uint32_t cb[29]; 95f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák}; 96f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák 97bbb1c6f6298fcb1125a8170f22646f326b0ca74cCorbin Simpsonstruct r300_dsa_state { 98371ca689ec5d1d7f301f4a3176c4e0df1c44ec15Marek Olšák struct pipe_depth_stencil_alpha_state dsa; 99371ca689ec5d1d7f301f4a3176c4e0df1c44ec15Marek Olšák 1000a44efaeb91c7cef9b244ae86c4977b019a63c54Marek Olšák /* This is actually a command buffer with named dwords. */ 1010a44efaeb91c7cef9b244ae86c4977b019a63c54Marek Olšák uint32_t cb_begin; 102bbb1c6f6298fcb1125a8170f22646f326b0ca74cCorbin Simpson uint32_t z_buffer_control; /* R300_ZB_CNTL: 0x4f00 */ 103bbb1c6f6298fcb1125a8170f22646f326b0ca74cCorbin Simpson uint32_t z_stencil_control; /* R300_ZB_ZSTENCILCNTL: 0x4f04 */ 104bbb1c6f6298fcb1125a8170f22646f326b0ca74cCorbin Simpson uint32_t stencil_ref_mask; /* R300_ZB_STENCILREFMASK: 0x4f08 */ 1050a44efaeb91c7cef9b244ae86c4977b019a63c54Marek Olšák uint32_t cb_reg; 1067961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson uint32_t stencil_ref_bf; /* R500_ZB_STENCILREFMASK_BF: 0x4fd4 */ 10710a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák uint32_t cb_reg1; 10810a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák uint32_t alpha_value; /* R500_FG_ALPHA_VALUE: 0x4be0 */ 10910a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák 110cc030da4284b6c965d2b72c68a875b3210a4b286Marek Olšák /* Same, but without ZB reads and writes. */ 111cc030da4284b6c965d2b72c68a875b3210a4b286Marek Olšák uint32_t cb_zb_no_readwrite[8]; /* ZB not bound */ 112cc030da4284b6c965d2b72c68a875b3210a4b286Marek Olšák 113cc030da4284b6c965d2b72c68a875b3210a4b286Marek Olšák /* Emitted separately: */ 114cc030da4284b6c965d2b72c68a875b3210a4b286Marek Olšák uint32_t alpha_function; 1150a44efaeb91c7cef9b244ae86c4977b019a63c54Marek Olšák 116a955f86b31304a1a0f35faa0e0861e920354e23bMarek Olšák /* Whether a two-sided stencil is enabled. */ 117a955f86b31304a1a0f35faa0e0861e920354e23bMarek Olšák boolean two_sided; 118a955f86b31304a1a0f35faa0e0861e920354e23bMarek Olšák /* Whether a fallback should be used for a two-sided stencil ref value. */ 11976034aaf655134c71e1ec619085c46251d037720Marek Olšák boolean two_sided_stencil_ref; 120bbb1c6f6298fcb1125a8170f22646f326b0ca74cCorbin Simpson}; 121bbb1c6f6298fcb1125a8170f22646f326b0ca74cCorbin Simpson 1220a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšákstruct r300_hyperz_state { 1236eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie int flush; 1240a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák /* This is actually a command buffer with named dwords. */ 1256eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie uint32_t cb_flush_begin; 1266eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie uint32_t zb_zcache_ctlstat; /* R300_ZB_CACHE_CNTL */ 1270a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák uint32_t cb_begin; 1280a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák uint32_t zb_bw_cntl; /* R300_ZB_BW_CNTL */ 1290a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák uint32_t cb_reg1; 1300a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák uint32_t zb_depthclearvalue; /* R300_ZB_DEPTHCLEARVALUE */ 1310a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák uint32_t cb_reg2; 1320a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák uint32_t sc_hyperz; /* R300_SC_HYPERZ */ 1336eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie uint32_t cb_reg3; 1346eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie uint32_t gb_z_peq_config; /* R300_GB_Z_PEQ_CONFIG: 0x4028 */ 1350a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák}; 1360a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák 13793bce03b275f66b6b2db410bbef38954de6a617cMarek Olšákstruct r300_gpu_flush { 13893bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák uint32_t cb_flush_clean[6]; 13993bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák}; 14093bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák 141dc4c821f0817a3db716f965692fb701079f66340Marek Olšák#define RS_STATE_MAIN_SIZE 27 14281b7de5bf039ecefe104f9892e2bdeaee71e40c6Dave Airlie 143a08a830fd3c22bdbad1ee840e4e56302152375f1Corbin Simpsonstruct r300_rs_state { 14487547ac70ce0f8696d16336177003f881c9ee836Marek Olšák /* Original rasterizer state. */ 1451bb2fb498ee65ba29aa4098983116be3d81cc2daCorbin Simpson struct pipe_rasterizer_state rs; 14687547ac70ce0f8696d16336177003f881c9ee836Marek Olšák /* Draw-specific rasterizer state. */ 14787547ac70ce0f8696d16336177003f881c9ee836Marek Olšák struct pipe_rasterizer_state rs_draw; 1481bb2fb498ee65ba29aa4098983116be3d81cc2daCorbin Simpson 1490a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák /* Command buffers. */ 15081b7de5bf039ecefe104f9892e2bdeaee71e40c6Dave Airlie uint32_t cb_main[RS_STATE_MAIN_SIZE]; 1510a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák uint32_t cb_poly_offset_zb16[5]; 1520a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák uint32_t cb_poly_offset_zb24[5]; 1530a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák 1540a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák /* The index to cb_main where the cull_mode register value resides. */ 1550a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák unsigned cull_mode_index; 1560a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák 1570a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák /* Whether polygon offset is enabled. */ 1580a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák boolean polygon_offset_enable; 1590a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák 1600a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák /* This is emitted in the draw function. */ 16117331a77f6480183ad0f43173f77d6c73cc377ffCorbin Simpson uint32_t color_control; /* R300_GA_COLOR_CONTROL: 0x4278 */ 162a08a830fd3c22bdbad1ee840e4e56302152375f1Corbin Simpson}; 163a08a830fd3c22bdbad1ee840e4e56302152375f1Corbin Simpson 164c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpsonstruct r300_rs_block { 16568e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák uint32_t vap_vtx_state_cntl; /* R300_VAP_VTX_STATE_CNTL: 0x2180 */ 16668e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák uint32_t vap_vsm_vtx_assm; /* R300_VAP_VSM_VTX_ASSM: 0x2184 */ 16768e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák uint32_t vap_out_vtx_fmt[2]; /* R300_VAP_OUTPUT_VTX_FMT_[0-1]: 0x2090 */ 16881b7de5bf039ecefe104f9892e2bdeaee71e40c6Dave Airlie uint32_t gb_enable; 16968e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák 170c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson uint32_t ip[8]; /* R300_RS_IP_[0-7], R500_RS_IP_[0-7] */ 171c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson uint32_t count; /* R300_RS_COUNT */ 172c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson uint32_t inst_count; /* R300_RS_INST_COUNT */ 173c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson uint32_t inst[8]; /* R300_RS_INST_[0-7] */ 174c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson}; 175c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson 17690a96cb2addf48b3b48c039a8dc6de9e53bfb6dfCorbin Simpsonstruct r300_sampler_state { 1776ba83cd63f84a4d74dd679d62662d59533fd1bdbMarek Olšák struct pipe_sampler_state state; 1786ba83cd63f84a4d74dd679d62662d59533fd1bdbMarek Olšák 1792f37387786f1d0d6beded5afc29d36f744f1c948Corbin Simpson uint32_t filter0; /* R300_TX_FILTER0: 0x4400 */ 1802f37387786f1d0d6beded5afc29d36f744f1c948Corbin Simpson uint32_t filter1; /* R300_TX_FILTER1: 0x4440 */ 181b7078a88119e248b0196f7446abe029c22f1ee28Marek Olšák 182b7078a88119e248b0196f7446abe029c22f1ee28Marek Olšák /* Min/max LOD must be clamped to [0, last_level], thus 183b7078a88119e248b0196f7446abe029c22f1ee28Marek Olšák * it's dependent on a currently bound texture */ 184b7078a88119e248b0196f7446abe029c22f1ee28Marek Olšák unsigned min_lod, max_lod; 18590a96cb2addf48b3b48c039a8dc6de9e53bfb6dfCorbin Simpson}; 18690a96cb2addf48b3b48c039a8dc6de9e53bfb6dfCorbin Simpson 187d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšákstruct r300_texture_format_state { 1889d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson uint32_t format0; /* R300_TX_FORMAT0: 0x4480 */ 1899d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson uint32_t format1; /* R300_TX_FORMAT1: 0x44c0 */ 1909d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson uint32_t format2; /* R300_TX_FORMAT2: 0x4500 */ 1911c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák uint32_t tile_config; /* R300_TX_OFFSET (subset thereof) */ 19210ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák uint32_t us_format0; /* R500_US_FORMAT0_0: 0x4640 (through 15) */ 1931c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák}; 1941c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák 1951c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšákstruct r300_sampler_view { 1961c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct pipe_sampler_view base; 1971c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák 198ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák /* For resource_copy_region. */ 199ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned width0_override; 200ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned height0_override; 201ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák 202fb523cb6ad3ffef22ab4b9cce9e53859c17c5739Marek Olšák /* Swizzles in the PIPE_SWIZZLE_* representation, 20371584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák * derived from base. */ 20471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák unsigned char swizzle[4]; 20571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 2061c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák /* Copy of r300_texture::texture_format_state with format-specific bits 2071c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák * added. */ 2081c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_texture_format_state format; 209e8f2adf8e3f381176703bf8bf4e927c8ce6bc891Marek Olšák 210e8f2adf8e3f381176703bf8bf4e927c8ce6bc891Marek Olšák /* The texture cache region for this texture. */ 211e8f2adf8e3f381176703bf8bf4e927c8ce6bc891Marek Olšák uint32_t texcache_region; 2121a503019d73701ed311b15107f314bc84968bdb7Corbin Simpson}; 2131a503019d73701ed311b15107f314bc84968bdb7Corbin Simpson 21471584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšákstruct r300_texture_sampler_state { 21571584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák struct r300_texture_format_state format; 21671584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák uint32_t filter0; /* R300_TX_FILTER0: 0x4400 */ 21771584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák uint32_t filter1; /* R300_TX_FILTER1: 0x4440 */ 21810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák uint32_t border_color; /* R300_TX_BORDER_COLOR: 0x45c0 */ 21971584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák}; 22071584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák 221d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšákstruct r300_textures_state { 222d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák /* Textures. */ 2231c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák struct r300_sampler_view *sampler_views[16]; 2241c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák int sampler_view_count; 225d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák /* Sampler states. */ 226d2686cdb2354b7cfe0e4eac3c5afab40cb947e0fMarek Olšák struct r300_sampler_state *sampler_states[16]; 2271c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák int sampler_state_count; 228d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák 2291c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák /* This is the merge of the texture and sampler states. */ 230d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák unsigned count; 231d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák uint32_t tx_enable; /* R300_TX_ENABLE: 0x4101 */ 23271584d0cc75dda3c579a2a0cb6c1ac9591f7d5c9Marek Olšák struct r300_texture_sampler_state regs[16]; 233d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák}; 234d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák 235942762cd973af0df75040de21d3321cd19829e70Marek Olšákstruct r300_vertex_stream_state { 236942762cd973af0df75040de21d3321cd19829e70Marek Olšák /* R300_VAP_PROG_STREAK_CNTL_[0-7] */ 237942762cd973af0df75040de21d3321cd19829e70Marek Olšák uint32_t vap_prog_stream_cntl[8]; 238942762cd973af0df75040de21d3321cd19829e70Marek Olšák /* R300_VAP_PROG_STREAK_CNTL_EXT_[0-7] */ 239942762cd973af0df75040de21d3321cd19829e70Marek Olšák uint32_t vap_prog_stream_cntl_ext[8]; 240942762cd973af0df75040de21d3321cd19829e70Marek Olšák 241942762cd973af0df75040de21d3321cd19829e70Marek Olšák unsigned count; 242942762cd973af0df75040de21d3321cd19829e70Marek Olšák}; 243942762cd973af0df75040de21d3321cd19829e70Marek Olšák 244bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšákstruct r300_invariant_state { 245bdb811772fe1b11e32172b211d9935d37093c753Marek Olšák uint32_t cb[24]; 246bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák}; 247bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák 248fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšákstruct r300_vap_invariant_state { 249952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák uint32_t cb[11]; 250fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák}; 251fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák 2523a648d0cf23c39a139e4638c2194e4ce97c1d983Corbin Simpsonstruct r300_viewport_state { 253db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson float xscale; /* R300_VAP_VPORT_XSCALE: 0x2098 */ 254db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson float xoffset; /* R300_VAP_VPORT_XOFFSET: 0x209c */ 255db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson float yscale; /* R300_VAP_VPORT_YSCALE: 0x20a0 */ 256db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson float yoffset; /* R300_VAP_VPORT_YOFFSET: 0x20a4 */ 257db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson float zscale; /* R300_VAP_VPORT_ZSCALE: 0x20a8 */ 258db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson float zoffset; /* R300_VAP_VPORT_ZOFFSET: 0x20ac */ 259db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson uint32_t vte_control; /* R300_VAP_VTE_CNTL: 0x20b0 */ 2603a648d0cf23c39a139e4638c2194e4ce97c1d983Corbin Simpson}; 2613a648d0cf23c39a139e4638c2194e4ce97c1d983Corbin Simpson 262a82fc97c643c4309a10cfefb108c4c0f11a2e55aCorbin Simpsonstruct r300_ztop_state { 263a82fc97c643c4309a10cfefb108c4c0f11a2e55aCorbin Simpson uint32_t z_buffer_top; /* R300_ZB_ZTOP: 0x4f14 */ 264a82fc97c643c4309a10cfefb108c4c0f11a2e55aCorbin Simpson}; 265a82fc97c643c4309a10cfefb108c4c0f11a2e55aCorbin Simpson 266fb8b794c69330924ad15083237b1a8a35eb62e31Corbin Simpson/* The next several objects are not pure Radeon state; they inherit from 267fb8b794c69330924ad15083237b1a8a35eb62e31Corbin Simpson * various Gallium classes. */ 268fb8b794c69330924ad15083237b1a8a35eb62e31Corbin Simpson 2691b77138a1effe2e18a9ce9e16c43852ff855a7beCorbin Simpsonstruct r300_constant_buffer { 2701b77138a1effe2e18a9ce9e16c43852ff855a7beCorbin Simpson /* Buffer of constants */ 2713eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák uint32_t *ptr; 272abae06ac85349a30996257f29f9c52c3f687d35dMarek Olšák /* Remapping table. */ 273abae06ac85349a30996257f29f9c52c3f687d35dMarek Olšák unsigned *remap_table; 274c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie /* const buffer base */ 275c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie uint32_t buffer_base; 2761b77138a1effe2e18a9ce9e16c43852ff855a7beCorbin Simpson}; 2771b77138a1effe2e18a9ce9e16c43852ff855a7beCorbin Simpson 278a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson/* Query object. 279a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson * 280a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson * This is not a subclass of pipe_query because pipe_query is never 281a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson * actually fully defined. So, rather than have it as a member, and do 282a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson * subclass-style casting, we treat pipe_query as an opaque, and just 283a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson * trust that our state tracker does not ever mess up query objects. 284a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson */ 285a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpsonstruct r300_query { 286a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson /* The kind of query. Currently only OQ is supported. */ 287a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson unsigned type; 288cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák /* The number of pipes where query results are stored. */ 289cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák unsigned num_pipes; 290cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák /* How many results have been written, in dwords. It's incremented 291cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák * after end_query and flush. */ 292cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák unsigned num_results; 29351d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie /* if begin has been emitted */ 29451d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie boolean begin_emitted; 295cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák 296cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák /* The buffer where query results are stored. */ 297d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct pb_buffer *buf; 298a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson}; 299a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson 3008874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšákstruct r300_surface { 3018874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák struct pipe_surface base; 3028874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák 3038874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák /* Winsys buffer backing the texture. */ 304d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct pb_buffer *buf; 3058874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák 30693f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák enum radeon_bo_domain domain; 30793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák 308f9e8cdc145fc0ba1f6c47e20860add6528387c7cMarek Olšák uint32_t offset; /* COLOROFFSET or DEPTHOFFSET. */ 3098874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák uint32_t pitch; /* COLORPITCH or DEPTHPITCH. */ 310d99ec708afbb785ce05031661222b38c9447059fMarek Olšák uint32_t pitch_zmask; /* ZMASK_PITCH */ 311d99ec708afbb785ce05031661222b38c9447059fMarek Olšák uint32_t pitch_hiz; /* HIZ_PITCH */ 312ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák uint32_t pitch_cmask; /* CMASK_PITCH */ 313f9e8cdc145fc0ba1f6c47e20860add6528387c7cMarek Olšák uint32_t format; /* US_OUT_FMT or ZB_FORMAT. */ 3148c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák 3158c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák /* Parameters dedicated to the CBZB clear. */ 3168c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák uint32_t cbzb_width; /* Aligned width. */ 3178c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák uint32_t cbzb_height; /* Half of the height. */ 3188c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák uint32_t cbzb_midpoint_offset; /* DEPTHOFFSET. */ 3198c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák uint32_t cbzb_pitch; /* DEPTHPITCH. */ 3208c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák uint32_t cbzb_format; /* ZB_FORMAT. */ 321d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 322d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Whether the CBZB clear is allowed on the surface. */ 323d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák boolean cbzb_allowed; 3241e51d368eb5360378218217ff35731896f48512fMarek Olšák 3251e51d368eb5360378218217ff35731896f48512fMarek Olšák unsigned colormask_swizzle; 3268874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák}; 3278874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák 328d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšákstruct r300_texture_desc { 32913359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák /* Width, height, and depth. 33013359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák * Most of the time, these are equal to pipe_texture::width0, height0, 33113359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák * and depth0. However, NPOT 3D textures must have dimensions aligned 33213359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák * to POT, and this is the only case when these variables differ from 33313359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák * pipe_texture. */ 33413359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák unsigned width0, height0, depth0; 33513359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák 336d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Buffer tiling. 337d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák * Macrotiling is specified per-level because small mipmaps cannot 338d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák * be macrotiled. */ 339d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák enum radeon_bo_layout microtile; 340d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák enum radeon_bo_layout macrotile[R300_MAX_TEXTURE_LEVELS]; 341b6b76cbb20b3d9467011231069e23972b98afa49Marek Olšák 3428e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson /* Offsets into the buffer. */ 343d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák unsigned offset_in_bytes[R300_MAX_TEXTURE_LEVELS]; 3448e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 345d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Strides for each mip-level. */ 346d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák unsigned stride_in_bytes[R300_MAX_TEXTURE_LEVELS]; 34763c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 348d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Size of one zslice or face or 2D image based on the texture target. */ 349d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák unsigned layer_size_in_bytes[R300_MAX_TEXTURE_LEVELS]; 3509dd06b8da45aa8100d61a09fc93c1bdfc16e9df8Marek Olšák 351d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Total size of this texture, in bytes, 352d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák * derived from the texture properties. */ 353d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák unsigned size_in_bytes; 354118dfe16887d1ec4d3b96d49b76fffa0d2924132Marek Olšák 3553cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle /** 3563cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * If non-zero, override the natural texture layout with 3573cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * a custom stride (in bytes). 3583cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * 3593cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * \note Mipmapping fails for textures with a non-natural layout! 3603cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * 3613cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle * \sa r300_texture_get_stride 3623cb30e55e48d86aa5f660e670e055d6b258ea54aNicolai Hähnle */ 363d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák unsigned stride_in_bytes_override; 364065e3f7ff2a9b6170e51b0104036088e8d163ea0Marek Olšák 36549330fc5ac13e25cb201e62995329cffaf5046f0Marek Olšák /* Whether this texture has non-power-of-two dimensions. 36649330fc5ac13e25cb201e62995329cffaf5046f0Marek Olšák * It can be either a regular texture or a rectangle one. */ 36749330fc5ac13e25cb201e62995329cffaf5046f0Marek Olšák boolean is_npot; 36849330fc5ac13e25cb201e62995329cffaf5046f0Marek Olšák 36949330fc5ac13e25cb201e62995329cffaf5046f0Marek Olšák /* This flag says that hardware must use the stride for addressing 37049330fc5ac13e25cb201e62995329cffaf5046f0Marek Olšák * instead of the width. */ 371d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák boolean uses_stride_addressing; 372d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 373d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák /* Whether CBZB fast color clear is allowed on the miplevel. */ 374d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák boolean cbzb_allowed[R300_MAX_TEXTURE_LEVELS]; 3752050f2ab96f923112d3475a655b31c8f5145a800Marek Olšák 3762050f2ab96f923112d3475a655b31c8f5145a800Marek Olšák /* Zbuffer compression info for each miplevel. */ 3772050f2ab96f923112d3475a655b31c8f5145a800Marek Olšák boolean zcomp8x8[R300_MAX_TEXTURE_LEVELS]; 378d99ec708afbb785ce05031661222b38c9447059fMarek Olšák /* If zero, then disable Z compression/HiZ. */ 3792050f2ab96f923112d3475a655b31c8f5145a800Marek Olšák unsigned zmask_dwords[R300_MAX_TEXTURE_LEVELS]; 380d99ec708afbb785ce05031661222b38c9447059fMarek Olšák unsigned hiz_dwords[R300_MAX_TEXTURE_LEVELS]; 381d99ec708afbb785ce05031661222b38c9447059fMarek Olšák /* Zmask/HiZ strides for each miplevel. */ 382d99ec708afbb785ce05031661222b38c9447059fMarek Olšák unsigned zmask_stride_in_pixels[R300_MAX_TEXTURE_LEVELS]; 383d99ec708afbb785ce05031661222b38c9447059fMarek Olšák unsigned hiz_stride_in_pixels[R300_MAX_TEXTURE_LEVELS]; 384ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák 385ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák /* CMASK info for AA buffers (no mipmapping). */ 386ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák unsigned cmask_dwords; 387ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák unsigned cmask_stride_in_pixels; 388d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák}; 389d779a5d16ae6a17b3fc0c097f4eb477a80e54566Marek Olšák 39056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšákstruct r300_resource 39156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák{ 392a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák struct u_resource b; 39363c9450ae776ff4207422442dd8c3d9d13a05e7aMarek Olšák 39456ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák /* Winsys buffer backing this resource. */ 395d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct pb_buffer *buf; 39693f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák enum radeon_bo_domain domain; 39756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák 39821b012d3b022c1c55358226f7bcc52fe50078123Marek Olšák /* Constant buffers and SWTCL vertex and index buffers are in user 39921b012d3b022c1c55358226f7bcc52fe50078123Marek Olšák * memory. */ 40021b012d3b022c1c55358226f7bcc52fe50078123Marek Olšák uint8_t *malloced_buffer; 40156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák 40256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák /* Texture description (addressing, layout, special features). */ 40356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák struct r300_texture_desc tex; 4049d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson 4056a34287bb5147a3213e94d88c97db4ec403509aeMarek Olšák /* This is the level tiling flags were last time set for. 4066a34287bb5147a3213e94d88c97db4ec403509aeMarek Olšák * It's used to prevent redundant tiling-flags changes from happening.*/ 4076a34287bb5147a3213e94d88c97db4ec403509aeMarek Olšák unsigned surface_level; 4088e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson}; 4098e11e0121466efa34cfc14d299b43455a30b198cCorbin Simpson 410141c7cb0d6078b3a2832c4be03ddcf25e35e596bCorbin Simpsonstruct r300_vertex_element_state { 411e9441e1f88cc07365f4d7d9149ccefe128809645Roland Scheidegger unsigned count; 4124240987cecdaaaeb2d6188f7c83ff4cb8e670c59Corbin Simpson struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS]; 413c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák unsigned format_size[PIPE_MAX_ATTRIBS]; 414141c7cb0d6078b3a2832c4be03ddcf25e35e596bCorbin Simpson 415eb7ef433bbbeabda963e74adf0ef61c47883f292Marek Olšák /* The size of the vertex, in dwords. */ 416eb7ef433bbbeabda963e74adf0ef61c47883f292Marek Olšák unsigned vertex_size_dwords; 417eb7ef433bbbeabda963e74adf0ef61c47883f292Marek Olšák 418141c7cb0d6078b3a2832c4be03ddcf25e35e596bCorbin Simpson struct r300_vertex_stream_state vertex_stream; 419e9441e1f88cc07365f4d7d9149ccefe128809645Roland Scheidegger}; 420e9441e1f88cc07365f4d7d9149ccefe128809645Roland Scheidegger 421ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšákenum r300_hiz_func { 422ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák HIZ_FUNC_NONE, 423ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák 424ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák /* The function, when determined, is set in stone 425ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák * until the next HiZ clear. */ 426ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák 427ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák /* MAX is written to the HiZ buffer. 428ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák * Used for LESS, LEQUAL. */ 429ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák HIZ_FUNC_MAX, 430ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák 431ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák /* MIN is written to the HiZ buffer. 432ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák * Used for GREATER, GEQUAL. */ 433ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák HIZ_FUNC_MIN, 434ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák}; 435ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák 4364af3fe857dc07923af8786b434dee32d493b577eMarek Olšák/* For deferred fragment shader state validation. */ 4374af3fe857dc07923af8786b434dee32d493b577eMarek Olšákenum r300_fs_validity_status { 4384af3fe857dc07923af8786b434dee32d493b577eMarek Olšák FRAGMENT_SHADER_VALID, /* No need to change/validate the FS. */ 4394af3fe857dc07923af8786b434dee32d493b577eMarek Olšák FRAGMENT_SHADER_MAYBE_DIRTY,/* Validate the FS if external state was changed. */ 4404af3fe857dc07923af8786b434dee32d493b577eMarek Olšák FRAGMENT_SHADER_DIRTY /* Always validate the FS (if the FS was changed) */ 4414af3fe857dc07923af8786b434dee32d493b577eMarek Olšák}; 4424af3fe857dc07923af8786b434dee32d493b577eMarek Olšák 4433e09a07a265d5ee75b110954d160a73d83793c40Corbin Simpsonstruct r300_context { 4443e09a07a265d5ee75b110954d160a73d83793c40Corbin Simpson /* Parent class */ 4453e09a07a265d5ee75b110954d160a73d83793c40Corbin Simpson struct pipe_context context; 4463e09a07a265d5ee75b110954d160a73d83793c40Corbin Simpson 447fbeeb6675733f5b2da36d40b0142dadf8cc953b4Corbin Simpson /* The interface to the windowing system, etc. */ 448d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct radeon_winsys *rws; 44942d9f6323a523d786fc3797587fdf63048beccebMarek Olšák /* The submission context. */ 45042d9f6323a523d786fc3797587fdf63048beccebMarek Olšák struct radeon_winsys_ctx *ctx; 451fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák /* The command stream. */ 452d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct radeon_winsys_cs *cs; 453b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák /* Screen. */ 454b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák struct r300_screen *screen; 4550392e48867c27f2aa445c5c9b35f4a52ecef2f2dMarek Olšák 456fbeeb6675733f5b2da36d40b0142dadf8cc953b4Corbin Simpson /* Draw module. Used mostly for SW TCL. */ 4573e09a07a265d5ee75b110954d160a73d83793c40Corbin Simpson struct draw_context* draw; 4580392e48867c27f2aa445c5c9b35f4a52ecef2f2dMarek Olšák /* Vertex buffer for SW TCL. */ 459ad1d1a4d9e4cb06424d477ddabac5885fa0613afMarek Olšák struct pb_buffer *vbo; 4600392e48867c27f2aa445c5c9b35f4a52ecef2f2dMarek Olšák /* Offset and size into the SW TCL VBO. */ 4610392e48867c27f2aa445c5c9b35f4a52ecef2f2dMarek Olšák size_t draw_vbo_offset; 4620392e48867c27f2aa445c5c9b35f4a52ecef2f2dMarek Olšák 46338a97148bf5df3c32087a5fdd799912d0275267dMarek Olšák /* Accelerated blit support. */ 46438a97148bf5df3c32087a5fdd799912d0275267dMarek Olšák struct blitter_context* blitter; 46576034aaf655134c71e1ec619085c46251d037720Marek Olšák /* Stencil two-sided reference value fallback. */ 46676034aaf655134c71e1ec619085c46251d037720Marek Olšák struct r300_stencilref_context *stencilref_fallback; 46774288078eab1971cc6ce3ae00fa55eb917b5826aCorbin Simpson 468d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák /* The KIL opcode needs the first texture unit to be enabled 469d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák * on r3xx-r4xx. In order to calm down the CS checker, we bind this 470d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák * dummy texture there. */ 471d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák struct r300_sampler_view *texkill_sampler; 4724816764777485b46f360eb6f86dea243d1809221Corbin Simpson 473ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák /* When no vertex buffer is set, this one is used instead to prevent 474ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák * hardlocks. */ 4752d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák struct pipe_vertex_buffer dummy_vb; 476ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák 477cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák /* The currently active query. */ 47847791697ab6eb6965f0ba8ba3f20373b3753ca2aDave Airlie struct r300_query *query_current; 479cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák /* The saved query for blitter operations. */ 480cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák struct r300_query *blitter_saved_query; 481cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák /* Query list. */ 482c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie struct r300_query query_list; 483a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson 48474288078eab1971cc6ce3ae00fa55eb917b5826aCorbin Simpson /* Various CSO state objects. */ 48566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák 48666d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Each atom is emitted in the order it appears here, which can affect 48766d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák * performance and stability if not handled with care. */ 48866d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* GPU flush. */ 48966d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom gpu_flush; 4907660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák /* Clears must be emitted immediately after the flush. */ 4917660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák /* HiZ clear */ 4927660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák struct r300_atom hiz_clear; 4937660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák /* zmask clear */ 4947660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák struct r300_atom zmask_clear; 4957660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák /* cmask clear */ 4967660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák struct r300_atom cmask_clear; 49769adebf5945d994485c584c183c148fc2c1373edMarek Olšák /* Anti-aliasing (MSAA) state. */ 49869adebf5945d994485c584c183c148fc2c1373edMarek Olšák struct r300_atom aa_state; 49966d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Framebuffer state. */ 50066d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom fb_state; 50166d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* HyperZ state (various SC/ZB bits). */ 50266d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom hyperz_state; 50366d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* ZTOP state. */ 50466d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom ztop_state; 50566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Depth, stencil, and alpha state. */ 50666d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom dsa_state; 50774288078eab1971cc6ce3ae00fa55eb917b5826aCorbin Simpson /* Blend state. */ 508d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson struct r300_atom blend_state; 509f3b53a5cb6a04b86ccd75cc38c73c8e3dd117894Corbin Simpson /* Blend color state. */ 5109d3db601c782805113e60ee7f6976184f2786427Corbin Simpson struct r300_atom blend_color_state; 51166d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Scissor state. */ 51266d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom scissor_state; 5138ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák /* Sample mask. */ 5148ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák struct r300_atom sample_mask; 51566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Invariant state. This must be emitted to get the engine started. */ 51666d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom invariant_state; 51766d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Viewport state. */ 51866d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom viewport_state; 51966d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* PVS flush. */ 52066d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom pvs_flush; 52166d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* VAP invariant state. */ 52266d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom vap_invariant_state; 52366d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Vertex stream formatting state. */ 52466d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom vertex_stream_state; 52566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Vertex shader. */ 52666d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom vs_state; 5271a359d983512b39783ce9f4eb842d3ea4ec012a6Corbin Simpson /* User clip planes. */ 528249374b85346663417fc09e4c1ad3c6fb908067bCorbin Simpson struct r300_atom clip_state; 52966d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* RS block state + VAP (vertex shader) output mapping state. */ 53066d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom rs_block_state; 53166d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Rasterizer state. */ 53266d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom rs_state; 53366d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Framebuffer state (pipelined regs). */ 53466d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom fb_state_pipelined; 535fb8b794c69330924ad15083237b1a8a35eb62e31Corbin Simpson /* Fragment shader. */ 53634092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák struct r300_atom fs; 5375633392966f56a75cb2a675ef9594e987c4591b9Marek Olšák /* Fragment shader RC_CONSTANT_STATE variables. */ 5385633392966f56a75cb2a675ef9594e987c4591b9Marek Olšák struct r300_atom fs_rc_constant_state; 539136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšák /* Fragment shader constant buffer. */ 540136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšák struct r300_atom fs_constants; 5413da70606b3af1e907d56666d199957b6da0c73feMarek Olšák /* Vertex shader constant buffer. */ 5423da70606b3af1e907d56666d199957b6da0c73feMarek Olšák struct r300_atom vs_constants; 543279715e76e5385afaad2834191e8578cf3a5d233Marek Olšák /* Texture cache invalidate. */ 544279715e76e5385afaad2834191e8578cf3a5d233Marek Olšák struct r300_atom texture_cache_inval; 54566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Textures state. */ 54666d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom textures_state; 54766d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* Occlusion query. */ 54866d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom query_start; 549a82fc97c643c4309a10cfefb108c4c0f11a2e55aCorbin Simpson 55066d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák /* The pointers to the first and the last atom. */ 55166d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák struct r300_atom *first_dirty, *last_dirty; 552fcbd285e421903ee0a65f19f5d633b25b5923c24Corbin Simpson 5533445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora /* Vertex elements for Gallium. */ 554141c7cb0d6078b3a2832c4be03ddcf25e35e596bCorbin Simpson struct r300_vertex_element_state *velems; 5553445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora 556942762cd973af0df75040de21d3321cd19829e70Marek Olšák /* Vertex info for Draw. */ 557942762cd973af0df75040de21d3321cd19829e70Marek Olšák struct vertex_info vertex_info; 5583445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora 559bf4b0773c570017c1c3ec80da769bf5c39a685b2Roland Scheidegger struct pipe_stencil_ref stencil_ref; 560b42455c4f48076eec34e383d5b9cc4670f2d048fMichal Krol struct pipe_viewport_state viewport; 561b42455c4f48076eec34e383d5b9cc4670f2d048fMichal Krol 56268e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák /* Stream locations for SWTCL. */ 56368e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák int stream_loc_notcl[16]; 56468e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák 5652e09845277ce75fa7d29020c5b119ad749522592Corbin Simpson /* Flag indicating whether or not the HW is dirty. */ 5662e09845277ce75fa7d29020c5b119ad749522592Corbin Simpson uint32_t dirty_hw; 567673ae6266ebf66145bf2bd7d37965f3fe60371d5Marek Olšák /* Whether polygon offset is enabled. */ 568673ae6266ebf66145bf2bd7d37965f3fe60371d5Marek Olšák boolean polygon_offset_enabled; 569673ae6266ebf66145bf2bd7d37965f3fe60371d5Marek Olšák /* Z buffer bit depth. */ 570673ae6266ebf66145bf2bd7d37965f3fe60371d5Marek Olšák uint32_t zbuffer_bpp; 571655fe281556679669699052f37412a6243771619Marek Olšák /* Whether rendering is conditional and should be skipped. */ 572655fe281556679669699052f37412a6243771619Marek Olšák boolean skip_rendering; 57376056510bcd35b6b5607b572c0c0ff47b5c5e7e2Marek Olšák /* The flag above saved by blitter. */ 57476056510bcd35b6b5607b572c0c0ff47b5c5e7e2Marek Olšák unsigned char blitter_saved_skip_rendering; 575745c4b568573fd5353e0f790251af64098742b1aMarek Olšák /* Point sprites texcoord index, 1 bit per texcoord */ 576745c4b568573fd5353e0f790251af64098742b1aMarek Olšák int sprite_coord_enable; 577d044ecbe7625af1118655bcc9dba7ed00342534fMarek Olšák /* Whether two-sided color selection is enabled (AKA light_twoside). */ 578d044ecbe7625af1118655bcc9dba7ed00342534fMarek Olšák boolean two_sided_color; 57985efb2fff0d4de56c31e414fd05a37d212211da1Marek Olšák boolean flatshade; 5808ddd2f7aee893f7ad2ce359e7d68729568ca3a5eMarek Olšák boolean clip_halfz; 581d99ec708afbb785ce05031661222b38c9447059fMarek Olšák /* Whether fast color clear is enabled. */ 5828c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák boolean cbzb_clear; 5834af3fe857dc07923af8786b434dee32d493b577eMarek Olšák /* Whether fragment shader needs to be validated. */ 5844af3fe857dc07923af8786b434dee32d493b577eMarek Olšák enum r300_fs_validity_status fs_status; 5854af3fe857dc07923af8786b434dee32d493b577eMarek Olšák /* Framebuffer multi-write. */ 5864af3fe857dc07923af8786b434dee32d493b577eMarek Olšák boolean fb_multiwrite; 5878ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák unsigned num_samples; 5888ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák boolean msaa_enable; 5898ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák boolean alpha_to_one; 5908ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák boolean alpha_to_coverage; 591db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 592db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák void *dsa_decompress_zmask; 5936eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie 59431714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák struct pipe_index_buffer index_buffer; 5952d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; 5962d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák unsigned nr_vertex_buffers; 597e54cc2c070b30dd9b14bf9aedf93138b660c867fMarek Olšák struct u_upload_mgr *uploader; 598c95bc1224a4b20b9470ddcb37b5f78975991073bMarek Olšák 599616e36674a1079dcfa131b3c9155cc473441b3deNicolai Hähnle struct slab_child_pool pool_transfers; 6007b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 601b02f1c86f5bf8b1169776975491c7df929e94e2cCorbin Simpson /* Stat counter. */ 602b02f1c86f5bf8b1169776975491c7df929e94e2cCorbin Simpson uint64_t flush_counter; 603c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie 604c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie /* const tracking for VS */ 605c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie int vs_const_base; 60678068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák 6075a6ba08c21f24b14458a2084a170ddfbe8f5d793Marek Olšák /* Vertex array state info */ 60833e0b726e8837a3456e224d169170ead25ee2fc5Marek Olšák boolean vertex_arrays_dirty; 6095a6ba08c21f24b14458a2084a170ddfbe8f5d793Marek Olšák boolean vertex_arrays_indexed; 6105a6ba08c21f24b14458a2084a170ddfbe8f5d793Marek Olšák int vertex_arrays_offset; 61165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák int vertex_arrays_instance_id; 61265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák boolean instancing_enabled; 613fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák 614fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák /* Hyper-Z stats. */ 615fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák boolean hyperz_enabled; /* Whether it owns Hyper-Z access. */ 616fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák int64_t hyperz_time_of_last_flush; /* Time of the last flush with Z clear. */ 617fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák unsigned num_z_clears; /* Since the last flush. */ 618fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák 619fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák /* ZMask state. */ 620fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák boolean zmask_in_use; /* Whether ZMASK is enabled. */ 621fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák boolean zmask_decompress; /* Whether ZMASK is being decompressed. */ 622fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák struct pipe_surface *locked_zbuffer; /* Unbound zbuffer which still has data in ZMASK. */ 623fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák 624fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák /* HiZ state. */ 625fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák boolean hiz_in_use; /* Whether HIZ is enabled. */ 626fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák enum r300_hiz_func hiz_func; /* HiZ function. Can be either MIN or MAX. */ 627fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák uint32_t hiz_clear_value; /* HiZ clear value. */ 628886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard 629ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák /* CMASK state. */ 630ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák boolean cmask_access; 631ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák boolean cmask_in_use; 632ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák uint32_t color_clear_value; /* RGBA8 or RGBA1010102 */ 633ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák uint32_t color_clear_value_ar; /* RGBA16F */ 634ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák uint32_t color_clear_value_gb; /* RGBA16F */ 635ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák 636886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard /* Compiler state. */ 637886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard struct rc_regalloc_state fs_regalloc_state; /* Register allocator info for 638886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard * fragment shaders. */ 6393b37cb49b821dd0c59fd5361ada6c0df9ac07db8Corbin Simpson}; 6403e09a07a265d5ee75b110954d160a73d83793c40Corbin Simpson 64166d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák#define foreach_atom(r300, atom) \ 64266d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák for (atom = &r300->gpu_flush; atom != (&r300->query_start)+1; atom++) 64366d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák 64466d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák#define foreach_dirty_atom(r300, atom) \ 64566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák for (atom = r300->first_dirty; atom != r300->last_dirty; atom++) 64666d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák 64773ee4e7eb254fa26e275917d358554bbe1e6c974Marek Olšák/* Convenience cast wrappers. */ 648a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct r300_query* r300_query(struct pipe_query* q) 64973ee4e7eb254fa26e275917d358554bbe1e6c974Marek Olšák{ 65073ee4e7eb254fa26e275917d358554bbe1e6c974Marek Olšák return (struct r300_query*)q; 65173ee4e7eb254fa26e275917d358554bbe1e6c974Marek Olšák} 65273ee4e7eb254fa26e275917d358554bbe1e6c974Marek Olšák 653a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct r300_surface* r300_surface(struct pipe_surface* surf) 6548874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák{ 6558874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák return (struct r300_surface*)surf; 6568874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák} 6578874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák 658a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct r300_resource* r300_resource(struct pipe_resource* tex) 659a1f85cf689b6f9ccf6b7310485460f84c8d78cadMarek Olšák{ 66056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák return (struct r300_resource*)tex; 661a1f85cf689b6f9ccf6b7310485460f84c8d78cadMarek Olšák} 662a1f85cf689b6f9ccf6b7310485460f84c8d78cadMarek Olšák 663a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct r300_context* r300_context(struct pipe_context* context) 66459155f70e701bc0b4fb816da991d6921f53b3bc7Nicolai Hähnle{ 6653b37cb49b821dd0c59fd5361ada6c0df9ac07db8Corbin Simpson return (struct r300_context*)context; 666aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson} 667aa96874c7abffa3fa9eef47ea36ab473ad2d2272Corbin Simpson 668a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct r300_fragment_shader *r300_fs(struct r300_context *r300) 66934092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák{ 67034092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák return (struct r300_fragment_shader*)r300->fs.state; 67134092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák} 6727f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell 673a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void r300_mark_atom_dirty(struct r300_context *r300, 6743332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák struct r300_atom *atom) 6753332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák{ 6763332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák atom->dirty = TRUE; 6773332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák 6783332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák if (!r300->first_dirty) { 6793332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák r300->first_dirty = atom; 6803332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák r300->last_dirty = atom+1; 6813332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák } else { 6823332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák if (atom < r300->first_dirty) 6833332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák r300->first_dirty = atom; 6843332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák else if (atom+1 > r300->last_dirty) 6853332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák r300->last_dirty = atom+1; 6863332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák } 6873332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák} 6883332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák 689a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct pipe_surface * 690e522c455e40b06a89885d413d564df40015259b3Marek Olšákr300_get_nonnull_cb(struct pipe_framebuffer_state *fb, unsigned i) 691e522c455e40b06a89885d413d564df40015259b3Marek Olšák{ 692e522c455e40b06a89885d413d564df40015259b3Marek Olšák if (fb->cbufs[i]) 693e522c455e40b06a89885d413d564df40015259b3Marek Olšák return fb->cbufs[i]; 694e522c455e40b06a89885d413d564df40015259b3Marek Olšák 695e522c455e40b06a89885d413d564df40015259b3Marek Olšák /* The i-th framebuffer is NULL, return any non-NULL one. */ 696e522c455e40b06a89885d413d564df40015259b3Marek Olšák for (i = 0; i < fb->nr_cbufs; i++) 697e522c455e40b06a89885d413d564df40015259b3Marek Olšák if (fb->cbufs[i]) 698e522c455e40b06a89885d413d564df40015259b3Marek Olšák return fb->cbufs[i]; 699e522c455e40b06a89885d413d564df40015259b3Marek Olšák 700e522c455e40b06a89885d413d564df40015259b3Marek Olšák return NULL; 701e522c455e40b06a89885d413d564df40015259b3Marek Olšák} 702e522c455e40b06a89885d413d564df40015259b3Marek Olšák 7037f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwellstruct pipe_context* r300_create_context(struct pipe_screen* screen, 7040fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšák void *priv, unsigned flags); 7057f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell 7064aaaecbfa6fa810899ef04de44f9f79ec4d8134fCorbin Simpson/* Context initialization. */ 7075c50218d009a4c8276aa561bd1483742cf6aa20eCorbin Simpsonstruct draw_stage* r300_draw_stage(struct r300_context* r300); 70885eede1b2f93333529d26a8f1e70eeac3bce76e1Marek Olšákvoid r300_init_blit_functions(struct r300_context *r300); 709d1dac360048e5eace88b93f88a4a4e23d2cec582Marek Olšákvoid r300_init_flush_functions(struct r300_context* r300); 71073ee4e7eb254fa26e275917d358554bbe1e6c974Marek Olšákvoid r300_init_query_functions(struct r300_context* r300); 711e1c117d87bd1c77c6093a7a77b7994a8313b084eMarek Olšákvoid r300_init_render_functions(struct r300_context *r300); 71221a5a133fff3ab1a068a11a32144dcb63f1d5020Corbin Simpsonvoid r300_init_state_functions(struct r300_context* r300); 713287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid r300_init_resource_functions(struct r300_context* r300); 7144aaaecbfa6fa810899ef04de44f9f79ec4d8134fCorbin Simpson 7154f5e51068bce4e32a9561b4b4d6f3feca33642bfMarek Olšák/* r300_blit.c */ 716db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid r300_decompress_zmask(struct r300_context *r300); 717db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid r300_decompress_zmask_locked_unsafe(struct r300_context *r300); 718db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšákvoid r300_decompress_zmask_locked(struct r300_context *r300); 719ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákbool r300_is_blit_supported(enum pipe_format format); 7204f5e51068bce4e32a9561b4b4d6f3feca33642bfMarek Olšák 7215650a719f0c69c00954e47bd7a7b3e9433cb551dMarek Olšák/* r300_flush.c */ 7225650a719f0c69c00954e47bd7a7b3e9433cb551dMarek Olšákvoid r300_flush(struct pipe_context *pipe, 7235650a719f0c69c00954e47bd7a7b3e9433cb551dMarek Olšák unsigned flags, 7245650a719f0c69c00954e47bd7a7b3e9433cb551dMarek Olšák struct pipe_fence_handle **fence); 7255650a719f0c69c00954e47bd7a7b3e9433cb551dMarek Olšák 726d99ec708afbb785ce05031661222b38c9447059fMarek Olšák/* r300_hyperz.c */ 727d99ec708afbb785ce05031661222b38c9447059fMarek Olšákvoid r300_update_hyperz_state(struct r300_context* r300); 728d99ec708afbb785ce05031661222b38c9447059fMarek Olšák 729cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák/* r300_query.c */ 730cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšákvoid r300_resume_query(struct r300_context *r300, 731cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák struct r300_query *query); 732cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšákvoid r300_stop_query(struct r300_context *r300); 733cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák 734aa5422327d6f49d8940c2b933c2342ad8968032cMarek Olšák/* r300_render_translate.c */ 735aa5422327d6f49d8940c2b933c2342ad8968032cMarek Olšákvoid r300_translate_index_buffer(struct r300_context *r300, 736bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák struct pipe_index_buffer *ib, 737bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák struct pipe_resource **out_index_buffer, 738aa5422327d6f49d8940c2b933c2342ad8968032cMarek Olšák unsigned *index_size, unsigned index_offset, 739aa5422327d6f49d8940c2b933c2342ad8968032cMarek Olšák unsigned *start, unsigned count); 740028459b0bf2bb778b55493f9b23ab7f2c9b355a0Marek Olšák 741cb17f5ee752d07d82e9b079c6bda9d89e51c7108Marek Olšák/* r300_render_stencilref.c */ 742cb17f5ee752d07d82e9b079c6bda9d89e51c7108Marek Olšákvoid r300_plug_in_stencil_ref_fallback(struct r300_context *r300); 743cb17f5ee752d07d82e9b079c6bda9d89e51c7108Marek Olšák 744cb925970eeade17016f59497d2123e4e8a447164Marek Olšák/* r300_render.c */ 745cb925970eeade17016f59497d2123e4e8a447164Marek Olšákvoid r500_emit_index_bias(struct r300_context *r300, int index_bias); 7466bede55241d8f672ba3d845e2ce1c00c7d65837eMarek Olšákvoid r300_blitter_draw_rectangle(struct blitter_context *blitter, 7470b0697e80dd442d7e7cb23641ad8f58f82df120dMarek Olšák int x1, int y1, int x2, int y2, 7486bede55241d8f672ba3d845e2ce1c00c7d65837eMarek Olšák float depth, 7496bede55241d8f672ba3d845e2ce1c00c7d65837eMarek Olšák enum blitter_attrib_type type, 7506bede55241d8f672ba3d845e2ce1c00c7d65837eMarek Olšák const union pipe_color_union *attrib); 751eb430b0e948caf02b9f4095d0e1435880073c2aaDave Airlie 752ea0ec0b48e5adc0b71e52cd298fd71193ffd4a54Marek Olšák/* r300_state.c */ 75362c631b20576ddee9a3c3d53709ca2932b0fbf9fMarek Olšákenum r300_fb_state_change { 7548c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák R300_CHANGED_FB_STATE = 0, 755db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák R300_CHANGED_HYPERZ_FLAG, 756ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák R300_CHANGED_MULTIWRITE, 757ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák R300_CHANGED_CMASK_ENABLE, 75862c631b20576ddee9a3c3d53709ca2932b0fbf9fMarek Olšák}; 75962c631b20576ddee9a3c3d53709ca2932b0fbf9fMarek Olšák 76062c631b20576ddee9a3c3d53709ca2932b0fbf9fMarek Olšákvoid r300_mark_fb_state_dirty(struct r300_context *r300, 76162c631b20576ddee9a3c3d53709ca2932b0fbf9fMarek Olšák enum r300_fb_state_change change); 762ea0ec0b48e5adc0b71e52cd298fd71193ffd4a54Marek Olšákvoid r300_mark_fs_code_dirty(struct r300_context *r300); 763ea0ec0b48e5adc0b71e52cd298fd71193ffd4a54Marek Olšák 764ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákstruct pipe_sampler_view * 765ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšákr300_create_sampler_view_custom(struct pipe_context *pipe, 766ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák struct pipe_resource *texture, 767ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák const struct pipe_sampler_view *templ, 768ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned width0_override, 769ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák unsigned height0_override); 770ce9d61fec64138ebf8d0bec2511e66593297b7d5Marek Olšák 7713332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšák/* r300_state_derived.c */ 7723332229b3ba7a183a9f120ae4bbf9865e96df110Marek Olšákvoid r300_update_derived_state(struct r300_context* r300); 77366d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák 774ea0ec0b48e5adc0b71e52cd298fd71193ffd4a54Marek Olšák/* r300_debug.c */ 77598630a900e78ec7ee598679c27c25923c1ffb929Marek Olšákvoid r500_dump_rs_block(struct r300_rs_block *rs); 77698630a900e78ec7ee598679c27c25923c1ffb929Marek Olšák 777ea0ec0b48e5adc0b71e52cd298fd71193ffd4a54Marek Olšák 778a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean CTX_DBG_ON(struct r300_context * ctx, unsigned flags) 7794b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle{ 780b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák return SCREEN_DBG_ON(ctx->screen, flags); 7814b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle} 7824b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle 783a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void CTX_DBG(struct r300_context * ctx, unsigned flags, 78408edbe9f14712f719f838769c61123f83768af76Marek Olšák const char * fmt, ...) 7854b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle{ 78608edbe9f14712f719f838769c61123f83768af76Marek Olšák if (CTX_DBG_ON(ctx, flags)) { 7874b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle va_list va; 7884b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle va_start(va, fmt); 7891c2912ee7a47170bbaa8a71d4af729d0caf17f04Marek Olšák vfprintf(stderr, fmt, va); 7904b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle va_end(va); 7914b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle } 7924b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle} 7934b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle 79408edbe9f14712f719f838769c61123f83768af76Marek Olšák#define DBG_ON CTX_DBG_ON 79508edbe9f14712f719f838769c61123f83768af76Marek Olšák#define DBG CTX_DBG 7964b01e6f614052e48971f2b2ff474fb66afc4f752Nicolai Hähnle 7974ce81294943177eed99d7418f1a2f88573b578feCorbin Simpson#endif /* R300_CONTEXT_H */ 798