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