17961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson/*
27961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
38cc570a48c2e8e18622027cbd76f16a746b430bcMarek Olšák * Copyright 2009 Marek Olšák <maraeo@gmail.com>
47961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson *
57961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * Permission is hereby granted, free of charge, to any person obtaining a
67961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * copy of this software and associated documentation files (the "Software"),
77961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * to deal in the Software without restriction, including without limitation
87961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * on the rights to use, copy, modify, merge, publish, distribute, sub
97961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * license, and/or sell copies of the Software, and to permit persons to whom
107961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * the Software is furnished to do so, subject to the following conditions:
117961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson *
127961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * The above copyright notice and this permission notice (including the next
137961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * paragraph) shall be included in all copies or substantial portions of the
147961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * Software.
157961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson *
167961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
177961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
187961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
197961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
207961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
217961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
227961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson * USE OR OTHER DEALINGS IN THE SOFTWARE. */
237961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson
247961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson/* r300_emit: Functions for emitting state. */
257961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson
26cceeab39ea541b1be1521114316d660a77769c2aMichal Krol#include "util/u_format.h"
276a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_math.h"
286eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie#include "util/u_mm.h"
297961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson
306a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_context.h"
3178068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák#include "r300_cb.h"
326a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_cs.h"
336a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_emit.h"
34d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle#include "r300_fs.h"
356a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_screen.h"
3668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include "r300_screen_buffer.h"
37188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnle#include "r300_vs.h"
38188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnle
39841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_blend_state(struct r300_context* r300,
40841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                           unsigned size, void* state)
41f1ba451bcc7764fd2b92fc8408f6b52c1d670b1fCorbin Simpson{
42d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson    struct r300_blend_state* blend = (struct r300_blend_state*)state;
43b9ae570bab5d0fefef93a9f6808603971304a74dCorbin Simpson    struct pipe_framebuffer_state* fb =
44b9ae570bab5d0fefef93a9f6808603971304a74dCorbin Simpson        (struct pipe_framebuffer_state*)r300->fb_state.state;
45f1ba451bcc7764fd2b92fc8408f6b52c1d670b1fCorbin Simpson    CS_LOCALS(r300);
46aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson
47b9ae570bab5d0fefef93a9f6808603971304a74dCorbin Simpson    if (fb->nr_cbufs) {
48e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        if (fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT) {
4923ccab39cd6b89efd8be238c3061e7ddb3697a55Marek Olšák            WRITE_CS_TABLE(blend->cb_noclamp, size);
50e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        } else {
51e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák            unsigned swz = r300_surface(fb->cbufs[0])->colormask_swizzle;
52e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák            WRITE_CS_TABLE(blend->cb_clamp[swz], size);
53e81717e9e7c46eed05f9a29adaaf4c86306a8920Marek Olšák        }
54a6d701d1c6ed8e0a649d62104aeded8fb25c66d8Marek Olšák    } else {
55cd891648d45189555bace1bca6b7cddef5857f02Marek Olšák        WRITE_CS_TABLE(blend->cb_no_readwrite, size);
56a6d701d1c6ed8e0a649d62104aeded8fb25c66d8Marek Olšák    }
57bea0c5812bd2795b514725d2a3788add3dc209afCorbin Simpson}
58bea0c5812bd2795b514725d2a3788add3dc209afCorbin Simpson
59841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_blend_color_state(struct r300_context* r300,
60841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                                 unsigned size, void* state)
61bea0c5812bd2795b514725d2a3788add3dc209afCorbin Simpson{
629d3db601c782805113e60ee7f6976184f2786427Corbin Simpson    struct r300_blend_color_state* bc = (struct r300_blend_color_state*)state;
63bea0c5812bd2795b514725d2a3788add3dc209afCorbin Simpson    CS_LOCALS(r300);
64b70f344e223fc10df8df08a6d82a813505225712Corbin Simpson
659dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák    WRITE_CS_TABLE(bc->cb, size);
66f1ba451bcc7764fd2b92fc8408f6b52c1d670b1fCorbin Simpson}
67f1ba451bcc7764fd2b92fc8408f6b52c1d670b1fCorbin Simpson
68841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_clip_state(struct r300_context* r300,
69841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                          unsigned size, void* state)
701a359d983512b39783ce9f4eb842d3ea4ec012a6Corbin Simpson{
71f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák    struct r300_clip_state* clip = (struct r300_clip_state*)state;
721a359d983512b39783ce9f4eb842d3ea4ec012a6Corbin Simpson    CS_LOCALS(r300);
731a359d983512b39783ce9f4eb842d3ea4ec012a6Corbin Simpson
74f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák    WRITE_CS_TABLE(clip->cb, size);
751a359d983512b39783ce9f4eb842d3ea4ec012a6Corbin Simpson}
761a359d983512b39783ce9f4eb842d3ea4ec012a6Corbin Simpson
77841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_dsa_state(struct r300_context* r300, unsigned size, void* state)
782e635ef563e2bff50e7a2af4f505bbd066865723Corbin Simpson{
7907ea7e6c80ef2bcb69ab12af69d27f7e118bc15aCorbin Simpson    struct r300_dsa_state* dsa = (struct r300_dsa_state*)state;
80b9ae570bab5d0fefef93a9f6808603971304a74dCorbin Simpson    struct pipe_framebuffer_state* fb =
81b9ae570bab5d0fefef93a9f6808603971304a74dCorbin Simpson        (struct pipe_framebuffer_state*)r300->fb_state.state;
822e635ef563e2bff50e7a2af4f505bbd066865723Corbin Simpson    CS_LOCALS(r300);
83b70f344e223fc10df8df08a6d82a813505225712Corbin Simpson
84b9ae570bab5d0fefef93a9f6808603971304a74dCorbin Simpson    if (fb->zsbuf) {
8510a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák        if (fb->nr_cbufs && fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT)
8610a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák            WRITE_CS_TABLE(&dsa->cb_begin_fp16, size);
8710a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák        else
8810a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák            WRITE_CS_TABLE(&dsa->cb_begin, size);
89a2926a2a8bbd72b6b78adf88478aa02c9624b289Marek Olšák    } else {
9010a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák        if (fb->nr_cbufs && fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT)
9110a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák            WRITE_CS_TABLE(dsa->cb_fp16_zb_no_readwrite, size);
9210a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák        else
9310a893106be9dc4c843100468d8575b07ba6c4b9Marek Olšák            WRITE_CS_TABLE(dsa->cb_zb_no_readwrite, size);
942e635ef563e2bff50e7a2af4f505bbd066865723Corbin Simpson    }
952e635ef563e2bff50e7a2af4f505bbd066865723Corbin Simpson}
962e635ef563e2bff50e7a2af4f505bbd066865723Corbin Simpson
978d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlichstatic void get_rc_constant_state(
988d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich    float vec[4],
99d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    struct r300_context * r300,
100ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák    struct rc_constant * constant)
101affe0311fa60489e56b854c09f713fae024a0b00Corbin Simpson{
102ca49a72a55895f8fefb090405a79918cbaa805eeCorbin Simpson    struct r300_textures_state* texstate = r300->textures_state.state;
10356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex;
104f4041b37e2d305cff0a97eb836250e9f8b1840a8Marek Olšák
105ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák    assert(constant->Type == RC_CONSTANT_STATE);
106ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák
1078d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich    /* vec should either be (0, 0, 0, 1), which should be a relatively safe
1088d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich     * RGBA or STRQ value, or it could be one of the RC_CONSTANT_STATE
1098d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich     * state factors. */
1108d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich
111ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák    switch (constant->u.State[0]) {
112ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák        /* Factor for converting rectangle coords to
113ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák         * normalized coords. Should only show up on non-r500. */
114ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák        case RC_STATE_R300_TEXRECT_FACTOR:
11556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex = r300_resource(texstate->sampler_views[constant->u.State[1]]->base.texture);
11656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            vec[0] = 1.0 / tex->tex.width0;
11756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            vec[1] = 1.0 / tex->tex.height0;
1188d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[2] = 0;
1198d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[3] = 1;
12013359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák            break;
12113359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák
12213359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák        case RC_STATE_R300_TEXSCALE_FACTOR:
12356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex = r300_resource(texstate->sampler_views[constant->u.State[1]]->base.texture);
12413359e6a4b732335cdd8da48276960d0b176ffe3Marek Olšák            /* Add a small number to the texture size to work around rounding errors in hw. */
125a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák            vec[0] = tex->b.b.width0  / (tex->tex.width0  + 0.001f);
126a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák            vec[1] = tex->b.b.height0 / (tex->tex.height0 + 0.001f);
127a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák            vec[2] = tex->b.b.depth0  / (tex->tex.depth0  + 0.001f);
1288d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[3] = 1;
129ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák            break;
130ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák
131ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák        case RC_STATE_R300_VIEWPORT_SCALE:
1323262554bb375230a39e155ad712740bdcd657d4cMarek Olšák            vec[0] = r300->viewport.scale[0];
1333262554bb375230a39e155ad712740bdcd657d4cMarek Olšák            vec[1] = r300->viewport.scale[1];
1343262554bb375230a39e155ad712740bdcd657d4cMarek Olšák            vec[2] = r300->viewport.scale[2];
1358d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[3] = 1;
136ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák            break;
137ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák
138ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák        case RC_STATE_R300_VIEWPORT_OFFSET:
1393262554bb375230a39e155ad712740bdcd657d4cMarek Olšák            vec[0] = r300->viewport.translate[0];
1403262554bb375230a39e155ad712740bdcd657d4cMarek Olšák            vec[1] = r300->viewport.translate[1];
1413262554bb375230a39e155ad712740bdcd657d4cMarek Olšák            vec[2] = r300->viewport.translate[2];
1428d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[3] = 1;
1436a95996abb33a040f957ffedf3824afcc98a9e71Corbin Simpson            break;
144f4041b37e2d305cff0a97eb836250e9f8b1840a8Marek Olšák
145d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle        default:
1464b8d3480764daf45cbbc03d76cd8b7c81937f532Marek Olšák            fprintf(stderr, "r300: Implementation error: "
147ef19b2fbabb68cfb2108409bbddbf1f52aa46ee2Marek Olšák                "Unknown RC_CONSTANT type %d\n", constant->u.State[0]);
1488d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[0] = 0;
1498d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[1] = 0;
1508d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[2] = 0;
1518d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            vec[3] = 1;
152d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    }
153d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle}
154d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle
155d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle/* Convert a normal single-precision float into the 7.16 format
156d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle * used by the R300 fragment shader.
157d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle */
1583da6487115216c47ce1be56b45be654ddb879d6fMarek Olšákuint32_t pack_float24(float f)
159d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle{
160d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    union {
161d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle        float fl;
162d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle        uint32_t u;
163d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    } u;
164d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    float mantissa;
165d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    int exponent;
166d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    uint32_t float24 = 0;
167d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle
168d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    if (f == 0.0)
169d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle        return 0;
170d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle
171d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    u.fl = f;
172d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle
173d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    mantissa = frexpf(f, &exponent);
174d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle
175d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    /* Handle -ve */
176d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    if (mantissa < 0) {
177d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle        float24 |= (1 << 23);
178d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle        mantissa = mantissa * -1.0;
179d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    }
180d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    /* Handle exponent, bias of 63 */
181d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    exponent += 62;
182d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    float24 |= (exponent << 16);
183d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    /* Kill 7 LSB of mantissa */
184d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    float24 |= (u.u & 0x7FFFFF) >> 7;
185d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle
186d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle    return float24;
187d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle}
188d0c398a8e2985b855f923aec3470cef8734a622aNicolai Hähnle
18934092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšákvoid r300_emit_fs(struct r300_context* r300, unsigned size, void *state)
19034092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák{
19134092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    struct r300_fragment_shader *fs = r300_fs(r300);
192be1dbba0a4d0d75468461aff8c281a512a537eccCorbin Simpson    CS_LOCALS(r300);
193b70f344e223fc10df8df08a6d82a813505225712Corbin Simpson
1943da6487115216c47ce1be56b45be654ddb879d6fMarek Olšák    WRITE_CS_TABLE(fs->shader->cb_code, fs->shader->cb_code_size);
1952db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora}
1962db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora
197136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšákvoid r300_emit_fs_constants(struct r300_context* r300, unsigned size, void *state)
1982db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora{
19934092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    struct r300_fragment_shader *fs = r300_fs(r300);
200136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšák    struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state;
201f92d1a54e998c1fbe65eefd7af539f97a60fc82bMarek Olšák    unsigned count = fs->shader->externals_count;
2023eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák    unsigned i, j;
2032db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora    CS_LOCALS(r300);
2042db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora
205953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    if (count == 0)
2062db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora        return;
207637b24a5904ab78cbd3fc61ea5fe39c52be711ceCorbin Simpson
208136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšák    BEGIN_CS(size);
209f7d6cab6cd4eda5c5ae63ccac6d0c2138a45f470Marek Olšák    OUT_CS_REG_SEQ(R300_PFS_PARAM_0_X, count * 4);
2100a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    if (buf->remap_table){
2110a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák        for (i = 0; i < count; i++) {
212c1ab2c327e37119b5dda3de85f672a8af22ad1bbMarek Olšák            float *data = (float*)&buf->ptr[buf->remap_table[i]*4];
2130a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák            for (j = 0; j < 4; j++)
2140a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák                OUT_CS(pack_float24(data[j]));
2150a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák        }
2160a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    } else {
2170a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák        for (i = 0; i < count; i++)
2180a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák            for (j = 0; j < 4; j++)
2190a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák                OUT_CS(pack_float24(*(float*)&buf->ptr[i*4+j]));
2200a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    }
2210a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák
222637b24a5904ab78cbd3fc61ea5fe39c52be711ceCorbin Simpson    END_CS;
223affe0311fa60489e56b854c09f713fae024a0b00Corbin Simpson}
224affe0311fa60489e56b854c09f713fae024a0b00Corbin Simpson
2255633392966f56a75cb2a675ef9594e987c4591b9Marek Olšákvoid r300_emit_fs_rc_constant_state(struct r300_context* r300, unsigned size, void *state)
226953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák{
22734092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    struct r300_fragment_shader *fs = r300_fs(r300);
2285633392966f56a75cb2a675ef9594e987c4591b9Marek Olšák    struct rc_constant_list *constants = &fs->shader->code.constants;
229953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    unsigned i;
23034092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    unsigned count = fs->shader->rc_state_count;
23134092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    unsigned first = fs->shader->externals_count;
232953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    unsigned end = constants->Count;
233f558bcb397e4016558b58fef01997b323ed931b0Marek Olšák    unsigned j;
234953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    CS_LOCALS(r300);
235953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
236953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    if (count == 0)
237953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák        return;
238953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
239905fa3a07bdd3615e67b5d19708f96f124600066Marek Olšák    BEGIN_CS(size);
240953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    for(i = first; i < end; ++i) {
241953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák        if (constants->Constants[i].Type == RC_CONSTANT_STATE) {
2428d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            float data[4];
2438d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich
2448d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            get_rc_constant_state(data, r300, &constants->Constants[i]);
245953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
246953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák            OUT_CS_REG_SEQ(R300_PFS_PARAM_0_X + i * 16, 4);
2473eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák            for (j = 0; j < 4; j++)
2483eb557778376bcbbc6f25da88ffbaa269607254cMarek Olšák                OUT_CS(pack_float24(data[j]));
249953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák        }
250953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    }
251953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    END_CS;
252953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák}
253953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
25434092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšákvoid r500_emit_fs(struct r300_context* r300, unsigned size, void *state)
25534092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák{
25634092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    struct r300_fragment_shader *fs = r300_fs(r300);
257be1dbba0a4d0d75468461aff8c281a512a537eccCorbin Simpson    CS_LOCALS(r300);
258b70f344e223fc10df8df08a6d82a813505225712Corbin Simpson
2593da6487115216c47ce1be56b45be654ddb879d6fMarek Olšák    WRITE_CS_TABLE(fs->shader->cb_code, fs->shader->cb_code_size);
2602db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora}
2612db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora
262136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšákvoid r500_emit_fs_constants(struct r300_context* r300, unsigned size, void *state)
2632db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora{
26434092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    struct r300_fragment_shader *fs = r300_fs(r300);
265136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšák    struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state;
2660a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    unsigned count = fs->shader->externals_count;
2672db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora    CS_LOCALS(r300);
2682db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora
269953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    if (count == 0)
2702db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora        return;
27144adea1a0975ebad59790b9cfd03439aa44559fcCorbin Simpson
272905fa3a07bdd3615e67b5d19708f96f124600066Marek Olšák    BEGIN_CS(size);
2732db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora    OUT_CS_REG(R500_GA_US_VECTOR_INDEX, R500_GA_US_VECTOR_INDEX_TYPE_CONST);
2740a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, count * 4);
2750a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    if (buf->remap_table){
2760a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák        for (unsigned i = 0; i < count; i++) {
2770a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák            uint32_t *data = &buf->ptr[buf->remap_table[i]*4];
2780a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák            OUT_CS_TABLE(data, 4);
2790a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák        }
2800a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    } else {
2810a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák        OUT_CS_TABLE(buf->ptr, count * 4);
2820a21938de92a1f1e74be7c4559b03179bd657fcdMarek Olšák    }
283affe0311fa60489e56b854c09f713fae024a0b00Corbin Simpson    END_CS;
284affe0311fa60489e56b854c09f713fae024a0b00Corbin Simpson}
285affe0311fa60489e56b854c09f713fae024a0b00Corbin Simpson
2865633392966f56a75cb2a675ef9594e987c4591b9Marek Olšákvoid r500_emit_fs_rc_constant_state(struct r300_context* r300, unsigned size, void *state)
287953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák{
28834092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    struct r300_fragment_shader *fs = r300_fs(r300);
2895633392966f56a75cb2a675ef9594e987c4591b9Marek Olšák    struct rc_constant_list *constants = &fs->shader->code.constants;
290953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    unsigned i;
29134092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    unsigned count = fs->shader->rc_state_count;
29234092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák    unsigned first = fs->shader->externals_count;
293953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    unsigned end = constants->Count;
294953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    CS_LOCALS(r300);
295953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
296953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    if (count == 0)
297953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák        return;
298953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
299905fa3a07bdd3615e67b5d19708f96f124600066Marek Olšák    BEGIN_CS(size);
300953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    for(i = first; i < end; ++i) {
301953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák        if (constants->Constants[i].Type == RC_CONSTANT_STATE) {
3028d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            float data[4];
3038d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich
3048d1ad3b21cedabb820bdc92b9395c98503e70f7bMathias Fröhlich            get_rc_constant_state(data, r300, &constants->Constants[i]);
305953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
306953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák            OUT_CS_REG(R500_GA_US_VECTOR_INDEX,
307953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák                       R500_GA_US_VECTOR_INDEX_TYPE_CONST |
308953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák                       (i & R500_GA_US_VECTOR_INDEX_MASK));
309953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák            OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, 4);
31059fcbc0ac5458c14ae2ec783df8736f3e2fe0963Corbin Simpson            OUT_CS_TABLE(data, 4);
311953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák        }
312953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    }
313953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák    END_CS;
314953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák}
315953a309de9204490edcd011e700c06c7c25c0b9eMarek Olšák
31693bce03b275f66b6b2db410bbef38954de6a617cMarek Olšákvoid r300_emit_gpu_flush(struct r300_context *r300, unsigned size, void *state)
317be53dfa3b9ca4d1503fdbdf934569442175e30efCorbin Simpson{
31893bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    struct r300_gpu_flush *gpuflush = (struct r300_gpu_flush*)state;
31993bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    struct pipe_framebuffer_state* fb =
32093bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák            (struct pipe_framebuffer_state*)r300->fb_state.state;
3218c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    uint32_t height = fb->height;
3228c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    uint32_t width = fb->width;
323be1dbba0a4d0d75468461aff8c281a512a537eccCorbin Simpson    CS_LOCALS(r300);
324be53dfa3b9ca4d1503fdbdf934569442175e30efCorbin Simpson
3258c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    if (r300->cbzb_clear) {
3268c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        struct r300_surface *surf = r300_surface(fb->cbufs[0]);
3278c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
3288c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        height = surf->cbzb_height;
3298c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        width = surf->cbzb_width;
3308c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    }
3318c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
332ab7cc445801b99a4482ea50429ceea1d0601a221Marek Olšák    DBG(r300, DBG_SCISSOR,
333ab7cc445801b99a4482ea50429ceea1d0601a221Marek Olšák	"r300: Scissor width: %i, height: %i, CBZB clear: %s\n",
334ab7cc445801b99a4482ea50429ceea1d0601a221Marek Olšák	width, height, r300->cbzb_clear ? "YES" : "NO");
335ab7cc445801b99a4482ea50429ceea1d0601a221Marek Olšák
3364ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
3376de7ac73bf027b9ace6f5f0c8063cbf724d95ceeMarek Olšák
3389b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák    /* Set up scissors.
3399b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák     * By writing to the SC registers, SC & US assert idle. */
3409b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák    OUT_CS_REG_SEQ(R300_SC_SCISSORS_TL, 2);
3419b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák    if (r300->screen->caps.is_r500) {
3429b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák        OUT_CS(0);
3438c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        OUT_CS(((width  - 1) << R300_SCISSORS_X_SHIFT) |
3448c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák               ((height - 1) << R300_SCISSORS_Y_SHIFT));
3459b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák    } else {
3469b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák        OUT_CS((1440 << R300_SCISSORS_X_SHIFT) |
3479b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák               (1440 << R300_SCISSORS_Y_SHIFT));
3488c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        OUT_CS(((width  + 1440-1) << R300_SCISSORS_X_SHIFT) |
3498c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák               ((height + 1440-1) << R300_SCISSORS_Y_SHIFT));
3509b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák    }
3519b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák
35293bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    /* Flush CB & ZB caches and wait until the 3D engine is idle and clean. */
35393bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    OUT_CS_TABLE(gpuflush->cb_flush_clean, 6);
35493bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    END_CS;
35593bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák}
35693bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák
35769adebf5945d994485c584c183c148fc2c1373edMarek Olšákvoid r300_emit_aa_state(struct r300_context *r300, unsigned size, void *state)
35869adebf5945d994485c584c183c148fc2c1373edMarek Olšák{
35969adebf5945d994485c584c183c148fc2c1373edMarek Olšák    struct r300_aa_state *aa = (struct r300_aa_state*)state;
36069adebf5945d994485c584c183c148fc2c1373edMarek Olšák    CS_LOCALS(r300);
36169adebf5945d994485c584c183c148fc2c1373edMarek Olšák
36269adebf5945d994485c584c183c148fc2c1373edMarek Olšák    BEGIN_CS(size);
36369adebf5945d994485c584c183c148fc2c1373edMarek Olšák    OUT_CS_REG(R300_GB_AA_CONFIG, aa->aa_config);
36469adebf5945d994485c584c183c148fc2c1373edMarek Olšák
36569adebf5945d994485c584c183c148fc2c1373edMarek Olšák    if (aa->dest) {
366ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_RB3D_AARESOLVE_OFFSET, aa->dest->offset);
367ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_RELOC(aa->dest);
368ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_RB3D_AARESOLVE_PITCH, aa->dest->pitch);
36969adebf5945d994485c584c183c148fc2c1373edMarek Olšák    }
37069adebf5945d994485c584c183c148fc2c1373edMarek Olšák
37169adebf5945d994485c584c183c148fc2c1373edMarek Olšák    OUT_CS_REG(R300_RB3D_AARESOLVE_CTL, aa->aaresolve_ctl);
37269adebf5945d994485c584c183c148fc2c1373edMarek Olšák    END_CS;
37369adebf5945d994485c584c183c148fc2c1373edMarek Olšák}
37469adebf5945d994485c584c183c148fc2c1373edMarek Olšák
37593bce03b275f66b6b2db410bbef38954de6a617cMarek Olšákvoid r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state)
37693bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák{
37793bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    struct pipe_framebuffer_state* fb = (struct pipe_framebuffer_state*)state;
37893bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    struct r300_surface* surf;
37993bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    unsigned i;
3804e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie    uint32_t rb3d_cctl = 0;
3814e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie
38293bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    CS_LOCALS(r300);
38393bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák
38493bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák    BEGIN_CS(size);
3859b2ebcaf4b94bfc8756f6b216e0e452013616f2cMarek Olšák
3867d5230ce90b5271b440da81c64ef20cdcb61491dMarek Olšák    /* NUM_MULTIWRITES replicates COLOR[0] to all colorbuffers, which is not
3877d5230ce90b5271b440da81c64ef20cdcb61491dMarek Olšák     * what we usually want. */
3887d5230ce90b5271b440da81c64ef20cdcb61491dMarek Olšák    if (r300->screen->caps.is_r500) {
3894e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie        rb3d_cctl = R300_RB3D_CCTL_INDEPENDENT_COLORFORMAT_ENABLE_ENABLE;
39000873227292df458b28249d7c3736d633e619dabCorbin Simpson    }
3914af3fe857dc07923af8786b434dee32d493b577eMarek Olšák    if (fb->nr_cbufs && r300->fb_multiwrite) {
3924e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie        rb3d_cctl |= R300_RB3D_CCTL_NUM_MULTIWRITES(fb->nr_cbufs);
3934e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie    }
3944e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie
3954e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie    OUT_CS_REG(R300_RB3D_CCTL, rb3d_cctl);
396cf85bf9cd0c168caed6210a896df285c3d86db03Marek Olšák
3976de7ac73bf027b9ace6f5f0c8063cbf724d95ceeMarek Olšák    /* Set up colorbuffers. */
398be53dfa3b9ca4d1503fdbdf934569442175e30efCorbin Simpson    for (i = 0; i < fb->nr_cbufs; i++) {
3998874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        surf = r300_surface(fb->cbufs[i]);
400f45a7a1d1f8a576daf02e94ecabfd42f556dd9b4Corbin Simpson
401ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_RB3D_COLOROFFSET0 + (4 * i), surf->offset);
402ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_RELOC(surf);
403073a73e4c7344db46ab89862e2fbc267da34969cCorbin Simpson
404ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_RB3D_COLORPITCH0 + (4 * i), surf->pitch);
405ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_RELOC(surf);
406be53dfa3b9ca4d1503fdbdf934569442175e30efCorbin Simpson    }
407b45e5e2a12e91cecec8922e58b2fc3960ab7ae14Corbin Simpson
4088c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    /* Set up the ZB part of the CBZB clear. */
4098c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    if (r300->cbzb_clear) {
4108c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        surf = r300_surface(fb->cbufs[0]);
4118c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
4128c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák        OUT_CS_REG(R300_ZB_FORMAT, surf->cbzb_format);
4138c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
414ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_ZB_DEPTHOFFSET, surf->cbzb_midpoint_offset);
415ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_RELOC(surf);
4168c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
417ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_ZB_DEPTHPITCH, surf->cbzb_pitch);
418ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_RELOC(surf);
4196eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie
4206eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie        DBG(r300, DBG_CBZB,
4216eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie            "CBZB clearing cbuf %08x %08x\n", surf->cbzb_format,
4226eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie            surf->cbzb_pitch);
4238c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    }
424a2926a2a8bbd72b6b78adf88478aa02c9624b289Marek Olšák    /* Set up a zbuffer. */
4258c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    else if (fb->zsbuf) {
4268874c9d7a3e59789843fa1b857e5318af17d146fMarek Olšák        surf = r300_surface(fb->zsbuf);
427f45a7a1d1f8a576daf02e94ecabfd42f556dd9b4Corbin Simpson
428a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák        OUT_CS_REG(R300_ZB_FORMAT, surf->format);
429a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák
430ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_ZB_DEPTHOFFSET, surf->offset);
431ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_RELOC(surf);
432f45a7a1d1f8a576daf02e94ecabfd42f556dd9b4Corbin Simpson
433ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_REG(R300_ZB_DEPTHPITCH, surf->pitch);
434ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        OUT_CS_RELOC(surf);
435a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák
436fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák        if (r300->hyperz_enabled) {
4376eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie            /* HiZ RAM. */
438d99ec708afbb785ce05031661222b38c9447059fMarek Olšák            OUT_CS_REG(R300_ZB_HIZ_OFFSET, 0);
439d99ec708afbb785ce05031661222b38c9447059fMarek Olšák            OUT_CS_REG(R300_ZB_HIZ_PITCH, surf->pitch_hiz);
4406eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie            /* Z Mask RAM. (compressed zbuffer) */
441db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák            OUT_CS_REG(R300_ZB_ZMASK_OFFSET, 0);
442d99ec708afbb785ce05031661222b38c9447059fMarek Olšák            OUT_CS_REG(R300_ZB_ZMASK_PITCH, surf->pitch_zmask);
443a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák        }
444f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák    /* Set up a dummy zbuffer. Otherwise occlusion queries won't work.
445f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák     * Use the first colorbuffer, we will disable writes in the DSA state
446f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák     * so as not to corrupt it. */
447f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák    } else if (fb->nr_cbufs) {
448f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák        surf = r300_surface(fb->cbufs[0]);
449f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák
450f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák        OUT_CS_REG(R300_ZB_FORMAT, R300_DEPTHFORMAT_16BIT_INT_Z);
451f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák
452f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák        OUT_CS_REG(R300_ZB_DEPTHOFFSET, 0);
453f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák        OUT_CS_RELOC(surf);
454f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák
455b1246cf13bc4e301b499a95d33e0cab26655fed5Marek Olšák        OUT_CS_REG(R300_ZB_DEPTHPITCH, 4 | R300_DEPTHMICROTILE_TILED_SQUARE);
456f76787b3eae3f0b8af839fabfb24b57715a017f6Marek Olšák        OUT_CS_RELOC(surf);
457a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák    }
458a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák
4590a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák    END_CS;
4600a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák}
4610a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák
4620a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšákvoid r300_emit_hyperz_state(struct r300_context *r300,
4630a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák                            unsigned size, void *state)
4640a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák{
4656eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    struct r300_hyperz_state *z = state;
4660a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák    CS_LOCALS(r300);
467db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák
4686eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    if (z->flush)
4696eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie        WRITE_CS_TABLE(&z->cb_flush_begin, size);
4706eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    else
4716eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie        WRITE_CS_TABLE(&z->cb_begin, size - 2);
4720a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák}
4730a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák
4748c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšákvoid r300_emit_hyperz_end(struct r300_context *r300)
4758c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák{
4768c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    struct r300_hyperz_state z =
4778c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák            *(struct r300_hyperz_state*)r300->hyperz_state.state;
4788c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
4796eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    z.flush = 1;
4808c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    z.zb_bw_cntl = 0;
4818c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    z.zb_depthclearvalue = 0;
4828c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    z.sc_hyperz = R300_SC_HYPERZ_ADJ_2;
4836eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    z.gb_z_peq_config = 0;
4848c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
4858c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák    r300_emit_hyperz_state(r300, r300->hyperz_state.size, &z);
4868c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák}
4878c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák
4880a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšákvoid r300_emit_fb_state_pipelined(struct r300_context *r300,
4890a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák                                  unsigned size, void *state)
4900a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák{
4910a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák    struct pipe_framebuffer_state* fb =
4920a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák            (struct pipe_framebuffer_state*)r300->fb_state.state;
4934e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie    unsigned i, num_cbufs = fb->nr_cbufs;
494a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    unsigned mspos0, mspos1;
4950a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák    CS_LOCALS(r300);
4960a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák
4974e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie    /* If we use the multiwrite feature, the colorbuffers 2,3,4 must be
4984e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie     * marked as UNUSED in the US block. */
4994af3fe857dc07923af8786b434dee32d493b577eMarek Olšák    if (r300->fb_multiwrite) {
5004e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie        num_cbufs = MIN2(num_cbufs, 1);
5014e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie    }
5024e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie
5030a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák    BEGIN_CS(size);
5040a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák
505a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák    /* Colorbuffer format in the US block.
506a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák     * (must be written after unpipelined regs) */
507a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák    OUT_CS_REG_SEQ(R300_US_OUT_FMT_0, 4);
5084e52e8f746e3565bf3fe9ba8e4e3744ce0302478Dave Airlie    for (i = 0; i < num_cbufs; i++) {
509a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák        OUT_CS(r300_surface(fb->cbufs[i])->format);
510a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák    }
511226ae9d6c8f282de788404b4d98af7ddf8ee30f4Marek Olšák    for (; i < 1; i++) {
512226ae9d6c8f282de788404b4d98af7ddf8ee30f4Marek Olšák        OUT_CS(R300_US_OUT_FMT_C4_8 |
513226ae9d6c8f282de788404b4d98af7ddf8ee30f4Marek Olšák               R300_C0_SEL_B | R300_C1_SEL_G |
514226ae9d6c8f282de788404b4d98af7ddf8ee30f4Marek Olšák               R300_C2_SEL_R | R300_C3_SEL_A);
515226ae9d6c8f282de788404b4d98af7ddf8ee30f4Marek Olšák    }
516a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák    for (; i < 4; i++) {
517a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák        OUT_CS(R300_US_OUT_FMT_UNUSED);
518b45e5e2a12e91cecec8922e58b2fc3960ab7ae14Corbin Simpson    }
519c200c47e6c2f8581608b83e703d611db1bebd7f6Marek Olšák
520c200c47e6c2f8581608b83e703d611db1bebd7f6Marek Olšák    /* Multisampling. Depends on framebuffer sample count.
521c200c47e6c2f8581608b83e703d611db1bebd7f6Marek Olšák     * These are pipelined regs and as such cannot be moved
522c200c47e6c2f8581608b83e703d611db1bebd7f6Marek Olšák     * to the AA state. */
523a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    mspos0 = 0x66666666;
524a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    mspos1 = 0x6666666;
525c200c47e6c2f8581608b83e703d611db1bebd7f6Marek Olšák
526a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    if (fb->nr_cbufs && fb->cbufs[0]->texture->nr_samples > 1) {
527a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        /* Subsample placement. These may not be optimal. */
528a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        switch (fb->cbufs[0]->texture->nr_samples) {
529a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        case 2:
530a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos0 = 0x33996633;
531a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos1 = 0x6666663;
532a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            break;
533a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        case 3:
534a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos0 = 0x33936933;
535a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos1 = 0x6666663;
536a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            break;
537a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        case 4:
538a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos0 = 0x33939933;
539a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos1 = 0x3966663;
540a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            break;
541a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        case 6:
542a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos0 = 0x22a2aa22;
543a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            mspos1 = 0x2a65672;
544a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            break;
545a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        default:
546a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák            debug_printf("r300: Bad number of multisamples!\n");
547a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák        }
548c200c47e6c2f8581608b83e703d611db1bebd7f6Marek Olšák    }
549a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák
550a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    OUT_CS_REG_SEQ(R300_GB_MSPOS0, 2);
551a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    OUT_CS(mspos0);
552a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    OUT_CS(mspos1);
553be53dfa3b9ca4d1503fdbdf934569442175e30efCorbin Simpson    END_CS;
554be53dfa3b9ca4d1503fdbdf934569442175e30efCorbin Simpson}
555be53dfa3b9ca4d1503fdbdf934569442175e30efCorbin Simpson
556eb4e399ef0d7b4fbeee744e79abcb79263549f7eMarek Olšákvoid r300_emit_query_start(struct r300_context *r300, unsigned size, void*state)
557a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson{
55847791697ab6eb6965f0ba8ba3f20373b3753ca2aDave Airlie    struct r300_query *query = r300->query_current;
559a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    CS_LOCALS(r300);
560a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson
56147791697ab6eb6965f0ba8ba3f20373b3753ca2aDave Airlie    if (!query)
56247791697ab6eb6965f0ba8ba3f20373b3753ca2aDave Airlie	return;
56347791697ab6eb6965f0ba8ba3f20373b3753ca2aDave Airlie
564eb4e399ef0d7b4fbeee744e79abcb79263549f7eMarek Olšák    BEGIN_CS(size);
565b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    if (r300->screen->caps.family == CHIP_FAMILY_RV530) {
56616a06fea73b1e6e8857f7568762bfc56dcfe2940Corbin Simpson        OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL);
567c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    } else {
56816a06fea73b1e6e8857f7568762bfc56dcfe2940Corbin Simpson        OUT_CS_REG(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_ALL);
569c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    }
570a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    OUT_CS_REG(R300_ZB_ZPASS_DATA, 0);
571a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    END_CS;
57251d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie    query->begin_emitted = TRUE;
573a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson}
574a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson
57516690366e66b0f37c76aff71e13ab91541b3807fMarek Olšákstatic void r300_emit_query_end_frag_pipes(struct r300_context *r300,
57616690366e66b0f37c76aff71e13ab91541b3807fMarek Olšák                                           struct r300_query *query)
577a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson{
578b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    struct r300_capabilities* caps = &r300->screen->caps;
57928a336dc38c478b809544e7404c4d1fddd873333Marek Olšák    uint32_t gb_pipes = r300->screen->info.r300_num_gb_pipes;
580a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    CS_LOCALS(r300);
581a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson
58228a336dc38c478b809544e7404c4d1fddd873333Marek Olšák    assert(gb_pipes);
583c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie
58428a336dc38c478b809544e7404c4d1fddd873333Marek Olšák    BEGIN_CS(6 * gb_pipes + 2);
585a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    /* I'm not so sure I like this switch, but it's hard to be elegant
586a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson     * when there's so many special cases...
587a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson     *
588a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson     * So here's the basic idea. For each pipe, enable writes to it only,
589a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson     * then put out the relocation for ZPASS_ADDR, taking into account a
590a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson     * 4-byte offset for each pipe. RV380 and older are special; they have
591a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson     * only two pipes, and the second pipe's enable is on bit 3, not bit 1,
592a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson     * so there's a chipset cap for that. */
59328a336dc38c478b809544e7404c4d1fddd873333Marek Olšák    switch (gb_pipes) {
594a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson        case 4:
595a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            /* pipe 3 only */
596a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            OUT_CS_REG(R300_SU_REG_DEST, 1 << 3);
597ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 3) * 4);
598ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_RELOC(r300->query_current);
599a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson        case 3:
600a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            /* pipe 2 only */
601a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            OUT_CS_REG(R300_SU_REG_DEST, 1 << 2);
602ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 2) * 4);
603ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_RELOC(r300->query_current);
604a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson        case 2:
605a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            /* pipe 1 only */
606a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            /* As mentioned above, accomodate RV380 and older. */
607a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            OUT_CS_REG(R300_SU_REG_DEST,
608a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson                    1 << (caps->high_second_pipe ? 3 : 1));
609ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 1) * 4);
610ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_RELOC(r300->query_current);
611a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson        case 1:
612a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            /* pipe 0 only */
613a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson            OUT_CS_REG(R300_SU_REG_DEST, 1 << 0);
614ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 0) * 4);
615ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_RELOC(r300->query_current);
61616a06fea73b1e6e8857f7568762bfc56dcfe2940Corbin Simpson            break;
617a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson        default:
6184b8d3480764daf45cbbc03d76cd8b7c81937f532Marek Olšák            fprintf(stderr, "r300: Implementation error: Chipset reports %d"
61928a336dc38c478b809544e7404c4d1fddd873333Marek Olšák                    " pixel pipes!\n", gb_pipes);
6204b8d3480764daf45cbbc03d76cd8b7c81937f532Marek Olšák            abort();
621a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    }
622a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson
623a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    /* And, finally, reset it to normal... */
624a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    OUT_CS_REG(R300_SU_REG_DEST, 0xF);
625a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    END_CS;
626a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson}
627a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson
62816690366e66b0f37c76aff71e13ab91541b3807fMarek Olšákstatic void rv530_emit_query_end_single_z(struct r300_context *r300,
62916690366e66b0f37c76aff71e13ab91541b3807fMarek Olšák                                          struct r300_query *query)
630c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie{
631c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    CS_LOCALS(r300);
632c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie
633c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    BEGIN_CS(8);
634c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_0);
635ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    OUT_CS_REG(R300_ZB_ZPASS_ADDR, query->num_results * 4);
636ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    OUT_CS_RELOC(r300->query_current);
637c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL);
638c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    END_CS;
639c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie}
640c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie
64116690366e66b0f37c76aff71e13ab91541b3807fMarek Olšákstatic void rv530_emit_query_end_double_z(struct r300_context *r300,
64216690366e66b0f37c76aff71e13ab91541b3807fMarek Olšák                                          struct r300_query *query)
643c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie{
644c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    CS_LOCALS(r300);
645c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie
646c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    BEGIN_CS(14);
647c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_0);
648ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 0) * 4);
649ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    OUT_CS_RELOC(r300->query_current);
650c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_1);
651ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 1) * 4);
652ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    OUT_CS_RELOC(r300->query_current);
653c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL);
654c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    END_CS;
655c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie}
656c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie
65751d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlievoid r300_emit_query_end(struct r300_context* r300)
658c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie{
659b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    struct r300_capabilities *caps = &r300->screen->caps;
66051d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie    struct r300_query *query = r300->query_current;
66151d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie
66251d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie    if (!query)
66351d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie	return;
66451d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie
66551d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie    if (query->begin_emitted == FALSE)
66651d1cf55da6f8b8a215814589a189b6e5e537fe5Dave Airlie        return;
667c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie
668c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    if (caps->family == CHIP_FAMILY_RV530) {
66928a336dc38c478b809544e7404c4d1fddd873333Marek Olšák        if (r300->screen->info.r300_num_z_pipes == 2)
67016690366e66b0f37c76aff71e13ab91541b3807fMarek Olšák            rv530_emit_query_end_double_z(r300, query);
67116a06fea73b1e6e8857f7568762bfc56dcfe2940Corbin Simpson        else
67216690366e66b0f37c76aff71e13ab91541b3807fMarek Olšák            rv530_emit_query_end_single_z(r300, query);
673c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie    } else
67416690366e66b0f37c76aff71e13ab91541b3807fMarek Olšák        r300_emit_query_end_frag_pipes(r300, query);
675251fae69e5d3a44c1a2a03f7172182e803a04792Marek Olšák
676251fae69e5d3a44c1a2a03f7172182e803a04792Marek Olšák    query->begin_emitted = FALSE;
677cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák    query->num_results += query->num_pipes;
678cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák
679cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák    /* XXX grab all the results and reset the counter. */
680671af44b1962a7a138185a4cfb992f6b349de10aMarek Olšák    if (query->num_results >= query->buf->size / 4 - 4) {
681671af44b1962a7a138185a4cfb992f6b349de10aMarek Olšák        query->num_results = (query->buf->size / 4) / 2;
682cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák        fprintf(stderr, "r300: Rewinding OQBO...\n");
683cf3778bae03460325960d2aec0cd4cdf325299ebMarek Olšák    }
684c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie}
685c1bee7bdea470b6b5dcebef9aacc8fe4feca687cDave Airlie
686bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšákvoid r300_emit_invariant_state(struct r300_context *r300,
687bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák                               unsigned size, void *state)
688bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák{
689bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák    CS_LOCALS(r300);
690bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák    WRITE_CS_TABLE(state, size);
691bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák}
692bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák
693841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_rs_state(struct r300_context* r300, unsigned size, void* state)
69470b508bffba723b58817e375447c1695d9d5602bCorbin Simpson{
695a91fea65dc574cc0ba2ccec936d60366b034489aCorbin Simpson    struct r300_rs_state* rs = state;
69670b508bffba723b58817e375447c1695d9d5602bCorbin Simpson    CS_LOCALS(r300);
697b70f344e223fc10df8df08a6d82a813505225712Corbin Simpson
6984ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
69981b7de5bf039ecefe104f9892e2bdeaee71e40c6Dave Airlie    OUT_CS_TABLE(rs->cb_main, RS_STATE_MAIN_SIZE);
700673ae6266ebf66145bf2bd7d37965f3fe60371d5Marek Olšák    if (rs->polygon_offset_enable) {
7010a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák        if (r300->zbuffer_bpp == 16) {
7020a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák            OUT_CS_TABLE(rs->cb_poly_offset_zb16, 5);
7030a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák        } else {
7040a9510814e2dfff57f7d73cc68aece0554ad794dMarek Olšák            OUT_CS_TABLE(rs->cb_poly_offset_zb24, 5);
705673ae6266ebf66145bf2bd7d37965f3fe60371d5Marek Olšák        }
706673ae6266ebf66145bf2bd7d37965f3fe60371d5Marek Olšák    }
70770b508bffba723b58817e375447c1695d9d5602bCorbin Simpson    END_CS;
70870b508bffba723b58817e375447c1695d9d5602bCorbin Simpson}
70970b508bffba723b58817e375447c1695d9d5602bCorbin Simpson
710841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_rs_block_state(struct r300_context* r300,
711841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                              unsigned size, void* state)
712c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson{
713fc20efe8e511bb9ec15c3d70e28b348ddaa4ad37Corbin Simpson    struct r300_rs_block* rs = (struct r300_rs_block*)state;
714fc20efe8e511bb9ec15c3d70e28b348ddaa4ad37Corbin Simpson    unsigned i;
7158eb4cd5b825db7bf26da240ccddaf9a7e5e55a62Marek Olšák    /* It's the same for both INST and IP tables */
7168eb4cd5b825db7bf26da240ccddaf9a7e5e55a62Marek Olšák    unsigned count = (rs->inst_count & R300_RS_INST_COUNT_MASK) + 1;
717c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    CS_LOCALS(r300);
718c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson
71950db6dba65560c1fb598d495d7d4103019bbbea5Marek Olšák    if (DBG_ON(r300, DBG_RS_BLOCK)) {
720fea91ee22d468bf2b66aaba9e7b509d30914a110Corbin Simpson        r500_dump_rs_block(rs);
721fea91ee22d468bf2b66aaba9e7b509d30914a110Corbin Simpson
722408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        fprintf(stderr, "r300: RS emit:\n");
723408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák
724408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        for (i = 0; i < count; i++)
725408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák            fprintf(stderr, "    : ip %d: 0x%08x\n", i, rs->ip[i]);
726408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák
727408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        for (i = 0; i < count; i++)
728408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák            fprintf(stderr, "    : inst %d: 0x%08x\n", i, rs->inst[i]);
729408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák
730408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        fprintf(stderr, "    : count: 0x%08x inst_count: 0x%08x\n",
731408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák            rs->count, rs->inst_count);
732408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák    }
733b6f93e2607f1bbc5b2f478f0a57d7786dd7d73a5Corbin Simpson
7344ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
73568e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák    OUT_CS_REG_SEQ(R300_VAP_VTX_STATE_CNTL, 2);
73668e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák    OUT_CS(rs->vap_vtx_state_cntl);
73768e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák    OUT_CS(rs->vap_vsm_vtx_assm);
73868e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák    OUT_CS_REG_SEQ(R300_VAP_OUTPUT_VTX_FMT_0, 2);
73968e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák    OUT_CS(rs->vap_out_vtx_fmt[0]);
74068e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák    OUT_CS(rs->vap_out_vtx_fmt[1]);
74181b7de5bf039ecefe104f9892e2bdeaee71e40c6Dave Airlie    OUT_CS_REG_SEQ(R300_GB_ENABLE, 1);
74281b7de5bf039ecefe104f9892e2bdeaee71e40c6Dave Airlie    OUT_CS(rs->gb_enable);
74368e720e12d51cf6d5237467a74af8c56b021acb7Marek Olšák
744b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    if (r300->screen->caps.is_r500) {
7458eb4cd5b825db7bf26da240ccddaf9a7e5e55a62Marek Olšák        OUT_CS_REG_SEQ(R500_RS_IP_0, count);
746c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    } else {
7478eb4cd5b825db7bf26da240ccddaf9a7e5e55a62Marek Olšák        OUT_CS_REG_SEQ(R300_RS_IP_0, count);
748c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    }
74959fcbc0ac5458c14ae2ec783df8736f3e2fe0963Corbin Simpson    OUT_CS_TABLE(rs->ip, count);
750c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson
751c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    OUT_CS_REG_SEQ(R300_RS_COUNT, 2);
752c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    OUT_CS(rs->count);
753c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    OUT_CS(rs->inst_count);
754c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson
755b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    if (r300->screen->caps.is_r500) {
7568eb4cd5b825db7bf26da240ccddaf9a7e5e55a62Marek Olšák        OUT_CS_REG_SEQ(R500_RS_INST_0, count);
757c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    } else {
7588eb4cd5b825db7bf26da240ccddaf9a7e5e55a62Marek Olšák        OUT_CS_REG_SEQ(R300_RS_INST_0, count);
759c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    }
76059fcbc0ac5458c14ae2ec783df8736f3e2fe0963Corbin Simpson    OUT_CS_TABLE(rs->inst, count);
761c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson    END_CS;
762c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson}
763c28298855bf5d5ef790d28bac2e77700625fa69aCorbin Simpson
764841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_scissor_state(struct r300_context* r300,
765841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                             unsigned size, void* state)
766484858ae48fef039034cf43391883a432ac40c78Corbin Simpson{
767ce1c493ff8fad4b62e2b66f06636ac6560a6e0adCorbin Simpson    struct pipe_scissor_state* scissor = (struct pipe_scissor_state*)state;
768484858ae48fef039034cf43391883a432ac40c78Corbin Simpson    CS_LOCALS(r300);
769b70f344e223fc10df8df08a6d82a813505225712Corbin Simpson
77008afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák    BEGIN_CS(size);
77108afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák    OUT_CS_REG_SEQ(R300_SC_CLIPRECT_TL_0, 2);
772b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    if (r300->screen->caps.is_r500) {
77308afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák        OUT_CS((scissor->minx << R300_CLIPRECT_X_SHIFT) |
77408afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák               (scissor->miny << R300_CLIPRECT_Y_SHIFT));
77508afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák        OUT_CS(((scissor->maxx - 1) << R300_CLIPRECT_X_SHIFT) |
77608afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák               ((scissor->maxy - 1) << R300_CLIPRECT_Y_SHIFT));
77756a4342a0493ad1d502d4791ab941ef171d36e60Michel Dänzer    } else {
77808afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák        OUT_CS(((scissor->minx + 1440) << R300_CLIPRECT_X_SHIFT) |
77908afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák               ((scissor->miny + 1440) << R300_CLIPRECT_Y_SHIFT));
78008afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák        OUT_CS(((scissor->maxx + 1440-1) << R300_CLIPRECT_X_SHIFT) |
78108afcaa56e187cdd137a5c6581c265c1a0fc8d18Marek Olšák               ((scissor->maxy + 1440-1) << R300_CLIPRECT_Y_SHIFT));
78256a4342a0493ad1d502d4791ab941ef171d36e60Michel Dänzer    }
783ce1c493ff8fad4b62e2b66f06636ac6560a6e0adCorbin Simpson    END_CS;
784484858ae48fef039034cf43391883a432ac40c78Corbin Simpson}
785484858ae48fef039034cf43391883a432ac40c78Corbin Simpson
786d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšákvoid r300_emit_textures_state(struct r300_context *r300,
787d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák                              unsigned size, void *state)
7889d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson{
789d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    struct r300_textures_state *allstate = (struct r300_textures_state*)state;
790d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    struct r300_texture_sampler_state *texstate;
79156ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex;
792d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    unsigned i;
79310ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák    boolean has_us_format = r300->screen->caps.has_us_format;
7949d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson    CS_LOCALS(r300);
7959d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
796d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    BEGIN_CS(size);
797d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    OUT_CS_REG(R300_TX_ENABLE, allstate->tx_enable);
798a1d726aae8fcacfa1eb1d76ce9c46adaafeaf4a4Marek Olšák
799d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    for (i = 0; i < allstate->count; i++) {
800d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák        if ((1 << i) & allstate->tx_enable) {
801d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák            texstate = &allstate->regs[i];
80256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex = r300_resource(allstate->sampler_views[i]->base.texture);
803d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák
8041c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák            OUT_CS_REG(R300_TX_FILTER0_0 + (i * 4), texstate->filter0);
8051c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák            OUT_CS_REG(R300_TX_FILTER1_0 + (i * 4), texstate->filter1);
806d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák            OUT_CS_REG(R300_TX_BORDER_COLOR_0 + (i * 4),
807d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák                       texstate->border_color);
808b7078a88119e248b0196f7446abe029c22f1ee28Marek Olšák
8091c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák            OUT_CS_REG(R300_TX_FORMAT0_0 + (i * 4), texstate->format.format0);
8101c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák            OUT_CS_REG(R300_TX_FORMAT1_0 + (i * 4), texstate->format.format1);
8111c356ac95b6df0962dbd15311ff7e0ea172e1aeaMarek Olšák            OUT_CS_REG(R300_TX_FORMAT2_0 + (i * 4), texstate->format.format2);
812b7078a88119e248b0196f7446abe029c22f1ee28Marek Olšák
813ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_REG(R300_TX_OFFSET_0 + (i * 4), texstate->format.tile_config);
814ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            OUT_CS_RELOC(tex);
81510ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák
81610ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            if (has_us_format) {
81710ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák                OUT_CS_REG(R500_US_FORMAT0_0 + (i * 4),
81810ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák                           texstate->format.us_format0);
81910ea8567f49f4daaa654b6e4c365a816f855073bMarek Olšák            }
820d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák        }
821d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    }
8229d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson    END_CS;
8239d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson}
8249d9e0815be41fa72ff5df6752b02551b648b33b6Corbin Simpson
82565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšákvoid r300_emit_vertex_arrays(struct r300_context* r300, int offset,
82665482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                             boolean indexed, int instance_id)
82778068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák{
8282d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák    struct pipe_vertex_buffer *vbuf = r300->vertex_buffer;
82978068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák    struct pipe_vertex_element *velem = r300->velems->velem;
83056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *buf;
83178068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák    int i;
83233e0b726e8837a3456e224d169170ead25ee2fc5Marek Olšák    unsigned vertex_array_count = r300->velems->count;
83333e0b726e8837a3456e224d169170ead25ee2fc5Marek Olšák    unsigned packet_size = (vertex_array_count * 3 + 1) / 2;
8343b01b52bd78e3d2fc857feacebd815a5fae00c94Vinson Lee    struct pipe_vertex_buffer *vb1, *vb2;
83565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák    unsigned *hw_format_size = r300->velems->format_size;
83665482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák    unsigned size1, size2, offset1, offset2, stride1, stride2;
83778068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák    CS_LOCALS(r300);
83878068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák
83933e0b726e8837a3456e224d169170ead25ee2fc5Marek Olšák    BEGIN_CS(2 + packet_size + vertex_array_count * 2);
84078068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák    OUT_CS_PKT3(R300_PACKET3_3D_LOAD_VBPNTR, packet_size);
84133e0b726e8837a3456e224d169170ead25ee2fc5Marek Olšák    OUT_CS(vertex_array_count | (!indexed ? R300_VC_FORCE_PREFETCH : 0));
84278068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák
84365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák    if (instance_id == -1) {
84465482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        /* Non-instanced arrays. This ignores instance_divisor and instance_id. */
84565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        for (i = 0; i < vertex_array_count - 1; i += 2) {
84665482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            vb1 = &vbuf[velem[i].vertex_buffer_index];
84765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            vb2 = &vbuf[velem[i+1].vertex_buffer_index];
84865482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            size1 = hw_format_size[i];
84965482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            size2 = hw_format_size[i+1];
85065482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák
85165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(vb1->stride) |
85265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                   R300_VBPNTR_SIZE1(size2) | R300_VBPNTR_STRIDE1(vb2->stride));
85365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(vb1->buffer_offset + velem[i].src_offset   + offset * vb1->stride);
85465482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(vb2->buffer_offset + velem[i+1].src_offset + offset * vb2->stride);
85565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        }
85678068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák
85765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        if (vertex_array_count & 1) {
85865482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            vb1 = &vbuf[velem[i].vertex_buffer_index];
85965482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            size1 = hw_format_size[i];
86078068a5fbfc21fb52b289a81142b4211628f845cMarek Olšák
86165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(vb1->stride));
86265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride);
86365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        }
8645a6ba08c21f24b14458a2084a170ddfbe8f5d793Marek Olšák
86565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        for (i = 0; i < vertex_array_count; i++) {
8660b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák            buf = r300_resource(vbuf[velem[i].vertex_buffer_index].buffer);
86765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS_RELOC(buf);
86865482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        }
86965482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák    } else {
87065482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        /* Instanced arrays. */
87165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        for (i = 0; i < vertex_array_count - 1; i += 2) {
87265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            vb1 = &vbuf[velem[i].vertex_buffer_index];
87365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            vb2 = &vbuf[velem[i+1].vertex_buffer_index];
87465482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            size1 = hw_format_size[i];
87565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            size2 = hw_format_size[i+1];
87665482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák
87765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            if (velem[i].instance_divisor) {
87865482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                stride1 = 0;
87965482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                offset1 = vb1->buffer_offset + velem[i].src_offset +
88065482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                          (instance_id / velem[i].instance_divisor) * vb1->stride;
88165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            } else {
88265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                stride1 = vb1->stride;
88365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                offset1 = vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride;
88465482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            }
88565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            if (velem[i+1].instance_divisor) {
88665482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                stride2 = 0;
88765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                offset2 = vb2->buffer_offset + velem[i+1].src_offset +
88865482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                          (instance_id / velem[i+1].instance_divisor) * vb2->stride;
88965482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            } else {
89065482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                stride2 = vb2->stride;
89165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                offset2 = vb2->buffer_offset + velem[i+1].src_offset + offset * vb2->stride;
89265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            }
89365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák
89465482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(stride1) |
89565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                   R300_VBPNTR_SIZE1(size2) | R300_VBPNTR_STRIDE1(stride2));
89665482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(offset1);
89765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(offset2);
89865482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        }
8995a6ba08c21f24b14458a2084a170ddfbe8f5d793Marek Olšák
90065482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        if (vertex_array_count & 1) {
90165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            vb1 = &vbuf[velem[i].vertex_buffer_index];
90265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            size1 = hw_format_size[i];
90365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák
90465482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            if (velem[i].instance_divisor) {
90565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                stride1 = 0;
90665482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                offset1 = vb1->buffer_offset + velem[i].src_offset +
90765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                          (instance_id / velem[i].instance_divisor) * vb1->stride;
90865482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            } else {
90965482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                stride1 = vb1->stride;
91065482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák                offset1 = vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride;
91165482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            }
91265482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák
91365482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(stride1));
91465482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS(offset1);
91565482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        }
9163445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora
91765482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        for (i = 0; i < vertex_array_count; i++) {
9180b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák            buf = r300_resource(vbuf[velem[i].vertex_buffer_index].buffer);
91965482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák            OUT_CS_RELOC(buf);
92065482f2c2b1c3456d0ca58a38d82c02a5d6d362cMarek Olšák        }
9213445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora    }
9223445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora    END_CS;
9233445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora}
9248cc570a48c2e8e18622027cbd76f16a746b430bcMarek Olšák
92533e0b726e8837a3456e224d169170ead25ee2fc5Marek Olšákvoid r300_emit_vertex_arrays_swtcl(struct r300_context *r300, boolean indexed)
92665b79383fb0ad7e14d097f6fdd7227605df4c7cbCorbin Simpson{
927be1dbba0a4d0d75468461aff8c281a512a537eccCorbin Simpson    CS_LOCALS(r300);
92865b79383fb0ad7e14d097f6fdd7227605df4c7cbCorbin Simpson
92950db6dba65560c1fb598d495d7d4103019bbbea5Marek Olšák    DBG(r300, DBG_SWTCL, "r300: Preparing vertex buffer %p for render, "
93081992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák            "vertex size %d\n", r300->vbo,
93181992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák            r300->vertex_info.size);
93281992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák    /* Set the pointer to our vertex buffer. The emitted values are this:
93381992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák     * PACKET3 [3D_LOAD_VBPNTR]
93481992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák     * COUNT   [1]
93581992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák     * FORMAT  [size | stride << 8]
93681992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák     * OFFSET  [offset into BO]
93781992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák     * VBPNTR  [relocated BO]
93881992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák     */
93981992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák    BEGIN_CS(7);
94081992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák    OUT_CS_PKT3(R300_PACKET3_3D_LOAD_VBPNTR, 3);
9413a6fd21917b7fb5a96bb60cd963f481ac5f989a6Marek Olšák    OUT_CS(1 | (!indexed ? R300_VC_FORCE_PREFETCH : 0));
94281992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák    OUT_CS(r300->vertex_info.size |
94381992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák            (r300->vertex_info.size << 8));
9440392e48867c27f2aa445c5c9b35f4a52ecef2f2dMarek Olšák    OUT_CS(r300->draw_vbo_offset);
945ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák    OUT_CS(0);
94656ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    OUT_CS_RELOC(r300_resource(r300->vbo));
94781992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák    END_CS;
94881992f37da64c2c89ce108e6b17159eee6085e5dMarek Olšák}
949b6f93e2607f1bbc5b2f478f0a57d7786dd7d73a5Corbin Simpson
950942762cd973af0df75040de21d3321cd19829e70Marek Olšákvoid r300_emit_vertex_stream_state(struct r300_context* r300,
951841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                                   unsigned size, void* state)
95265b79383fb0ad7e14d097f6fdd7227605df4c7cbCorbin Simpson{
953942762cd973af0df75040de21d3321cd19829e70Marek Olšák    struct r300_vertex_stream_state *streams =
954942762cd973af0df75040de21d3321cd19829e70Marek Olšák        (struct r300_vertex_stream_state*)state;
95560aa7f1f8042a9291339a3b337a2f1adacf12841Corbin Simpson    unsigned i;
956be1dbba0a4d0d75468461aff8c281a512a537eccCorbin Simpson    CS_LOCALS(r300);
957709ebabb26e20c171741338a3a9e9626ae87aa87Corbin Simpson
95850db6dba65560c1fb598d495d7d4103019bbbea5Marek Olšák    if (DBG_ON(r300, DBG_PSC)) {
959408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        fprintf(stderr, "r300: PSC emit:\n");
960408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák
961408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        for (i = 0; i < streams->count; i++) {
962408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák            fprintf(stderr, "    : prog_stream_cntl%d: 0x%08x\n", i,
963408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák                   streams->vap_prog_stream_cntl[i]);
964408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        }
965408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák
966408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        for (i = 0; i < streams->count; i++) {
967408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák            fprintf(stderr, "    : prog_stream_cntl_ext%d: 0x%08x\n", i,
968408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák                   streams->vap_prog_stream_cntl_ext[i]);
969408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák        }
970408a88612791fd5feae841db24a5e1e1bf4ffd1bMarek Olšák    }
97165b79383fb0ad7e14d097f6fdd7227605df4c7cbCorbin Simpson
9724ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
973942762cd973af0df75040de21d3321cd19829e70Marek Olšák    OUT_CS_REG_SEQ(R300_VAP_PROG_STREAM_CNTL_0, streams->count);
97459fcbc0ac5458c14ae2ec783df8736f3e2fe0963Corbin Simpson    OUT_CS_TABLE(streams->vap_prog_stream_cntl, streams->count);
975942762cd973af0df75040de21d3321cd19829e70Marek Olšák    OUT_CS_REG_SEQ(R300_VAP_PROG_STREAM_CNTL_EXT_0, streams->count);
97659fcbc0ac5458c14ae2ec783df8736f3e2fe0963Corbin Simpson    OUT_CS_TABLE(streams->vap_prog_stream_cntl_ext, streams->count);
97765b79383fb0ad7e14d097f6fdd7227605df4c7cbCorbin Simpson    END_CS;
97865b79383fb0ad7e14d097f6fdd7227605df4c7cbCorbin Simpson}
97965b79383fb0ad7e14d097f6fdd7227605df4c7cbCorbin Simpson
980fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšákvoid r300_emit_pvs_flush(struct r300_context* r300, unsigned size, void* state)
981ddd0c94f0440cebc5e63afc1ae0300e0f51bc0a3Corbin Simpson{
982686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    CS_LOCALS(r300);
983686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson
9844ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
985686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    OUT_CS_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0x0);
986686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    END_CS;
987686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson}
988beea241374a91b8aab81db175b28e98c2b4835d9Marek Olšák
989fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšákvoid r300_emit_vap_invariant_state(struct r300_context *r300,
990fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák                                   unsigned size, void *state)
991fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák{
992fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák    CS_LOCALS(r300);
993fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák    WRITE_CS_TABLE(state, size);
994fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák}
995fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák
996841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_vs_state(struct r300_context* r300, unsigned size, void* state)
997ddd0c94f0440cebc5e63afc1ae0300e0f51bc0a3Corbin Simpson{
998686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    struct r300_vertex_shader* vs = (struct r300_vertex_shader*)state;
999686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    struct r300_vertex_program_code* code = &vs->code;
1000b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    struct r300_screen* r300screen = r300->screen;
1001188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnle    unsigned instruction_count = code->length / 4;
1002686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson
1003b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák    unsigned vtx_mem_size = r300screen->caps.is_r500 ? 128 : 72;
1004686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    unsigned input_count = MAX2(util_bitcount(code->InputsRead), 1);
1005686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    unsigned output_count = MAX2(util_bitcount(code->OutputsWritten), 1);
1006686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    unsigned temp_count = MAX2(code->num_temporaries, 1);
1007beea241374a91b8aab81db175b28e98c2b4835d9Marek Olšák
1008686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson    unsigned pvs_num_slots = MIN3(vtx_mem_size / input_count,
1009686f69bd13fd2aebaa40edeb7e25e4a49b12a2bdCorbin Simpson                                  vtx_mem_size / output_count, 10);
101097cbb563f82f9242a4d7588e502eb2d289eb1b36Marek Olšák    unsigned pvs_num_controllers = MIN2(vtx_mem_size / temp_count, 5);
1011beea241374a91b8aab81db175b28e98c2b4835d9Marek Olšák
1012be1dbba0a4d0d75468461aff8c281a512a537eccCorbin Simpson    CS_LOCALS(r300);
1013ddd0c94f0440cebc5e63afc1ae0300e0f51bc0a3Corbin Simpson
10144ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
1015a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák
10169e4590dff72b8739e787da7f0d86c7066f179186Corbin Simpson    /* R300_VAP_PVS_CODE_CNTL_0
10179e4590dff72b8739e787da7f0d86c7066f179186Corbin Simpson     * R300_VAP_PVS_CONST_CNTL
10189e4590dff72b8739e787da7f0d86c7066f179186Corbin Simpson     * R300_VAP_PVS_CODE_CNTL_1
1019beea241374a91b8aab81db175b28e98c2b4835d9Marek Olšák     * See the r5xx docs for instructions on how to use these. */
1020c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    OUT_CS_REG(R300_VAP_PVS_CODE_CNTL_0, R300_PVS_FIRST_INST(0) |
1021c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie	       R300_PVS_XYZW_VALID_INST(instruction_count - 1) |
1022c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie	       R300_PVS_LAST_INST(instruction_count - 1));
1023c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    OUT_CS_REG(R300_VAP_PVS_CODE_CNTL_1, instruction_count - 1);
10247540c847f1f046967d31445d5c936bcfdc7ed863Corbin Simpson
10257540c847f1f046967d31445d5c936bcfdc7ed863Corbin Simpson    OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG, 0);
1026188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnle    OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, code->length);
102759fcbc0ac5458c14ae2ec783df8736f3e2fe0963Corbin Simpson    OUT_CS_TABLE(code->body.d, code->length);
10287540c847f1f046967d31445d5c936bcfdc7ed863Corbin Simpson
1029beea241374a91b8aab81db175b28e98c2b4835d9Marek Olšák    OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(pvs_num_slots) |
1030beea241374a91b8aab81db175b28e98c2b4835d9Marek Olšák            R300_PVS_NUM_CNTLRS(pvs_num_controllers) |
1031b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák            R300_PVS_NUM_FPUS(r300screen->caps.num_vert_fpus) |
1032beea241374a91b8aab81db175b28e98c2b4835d9Marek Olšák            R300_PVS_VF_MAX_VTX_NUM(12) |
1033b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák            (r300screen->caps.is_r500 ? R500_TCL_STATE_OPTIMIZATION : 0));
1034abc2f29dd2baa9c8aa672f07a1500e579364ab29Marek Olšák
10354a269a8dc0170c75ff22af3910786228727ea41eTom Stellard    /* Emit flow control instructions.  Even if there are no fc instructions,
10364a269a8dc0170c75ff22af3910786228727ea41eTom Stellard     * we still need to write the registers to make sure they are cleared. */
10374a269a8dc0170c75ff22af3910786228727ea41eTom Stellard    OUT_CS_REG(R300_VAP_PVS_FLOW_CNTL_OPC, code->fc_ops);
10384a269a8dc0170c75ff22af3910786228727ea41eTom Stellard    if (r300screen->caps.is_r500) {
10394a269a8dc0170c75ff22af3910786228727ea41eTom Stellard        OUT_CS_REG_SEQ(R500_VAP_PVS_FLOW_CNTL_ADDRS_LW_0, R300_VS_MAX_FC_OPS * 2);
10404a269a8dc0170c75ff22af3910786228727ea41eTom Stellard        OUT_CS_TABLE(code->fc_op_addrs.r500, R300_VS_MAX_FC_OPS * 2);
10414a269a8dc0170c75ff22af3910786228727ea41eTom Stellard    } else {
10424a269a8dc0170c75ff22af3910786228727ea41eTom Stellard        OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_ADDRS_0, R300_VS_MAX_FC_OPS);
10434a269a8dc0170c75ff22af3910786228727ea41eTom Stellard        OUT_CS_TABLE(code->fc_op_addrs.r300, R300_VS_MAX_FC_OPS);
1044c298bab60ea63882f34825a35cbc60f662783e64Tom Stellard    }
10454a269a8dc0170c75ff22af3910786228727ea41eTom Stellard    OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_LOOP_INDEX_0, R300_VS_MAX_FC_OPS);
10464a269a8dc0170c75ff22af3910786228727ea41eTom Stellard    OUT_CS_TABLE(code->fc_loop_index, R300_VS_MAX_FC_OPS);
1047c298bab60ea63882f34825a35cbc60f662783e64Tom Stellard
1048ddd0c94f0440cebc5e63afc1ae0300e0f51bc0a3Corbin Simpson    END_CS;
1049ddd0c94f0440cebc5e63afc1ae0300e0f51bc0a3Corbin Simpson}
1050ddd0c94f0440cebc5e63afc1ae0300e0f51bc0a3Corbin Simpson
10513da70606b3af1e907d56666d199957b6da0c73feMarek Olšákvoid r300_emit_vs_constants(struct r300_context* r300,
10523da70606b3af1e907d56666d199957b6da0c73feMarek Olšák                            unsigned size, void *state)
10532db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora{
10543da70606b3af1e907d56666d199957b6da0c73feMarek Olšák    unsigned count =
10553da70606b3af1e907d56666d199957b6da0c73feMarek Olšák        ((struct r300_vertex_shader*)r300->vs_state.state)->externals_count;
10563da70606b3af1e907d56666d199957b6da0c73feMarek Olšák    struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state;
1057c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    struct r300_vertex_shader *vs = (struct r300_vertex_shader*)r300->vs_state.state;
1058abae06ac85349a30996257f29f9c52c3f687d35dMarek Olšák    unsigned i;
1059c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    int imm_first = vs->externals_count;
1060c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    int imm_end = vs->code.constants.Count;
1061c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    int imm_count = vs->immediates_count;
10622db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora    CS_LOCALS(r300);
10632db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora
10643da70606b3af1e907d56666d199957b6da0c73feMarek Olšák    BEGIN_CS(size);
1065c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    OUT_CS_REG(R300_VAP_PVS_CONST_CNTL,
1066c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie               R300_PVS_CONST_BASE_OFFSET(buf->buffer_base) |
1067c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie               R300_PVS_MAX_CONST_ADDR(MAX2(imm_end - 1, 0)));
1068c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    if (vs->externals_count) {
1069c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG,
1070c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie                   (r300->screen->caps.is_r500 ?
1071c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie                   R500_PVS_CONST_START : R300_PVS_CONST_START) + buf->buffer_base);
1072c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, count * 4);
1073c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        if (buf->remap_table){
1074c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie            for (i = 0; i < count; i++) {
1075c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie                uint32_t *data = &buf->ptr[buf->remap_table[i]*4];
1076c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie                OUT_CS_TABLE(data, 4);
1077c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie            }
1078c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        } else {
1079c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie            OUT_CS_TABLE(buf->ptr, count * 4);
1080c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        }
1081c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    }
1082c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie
1083c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    /* Emit immediates. */
1084c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie    if (imm_count) {
1085c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG,
1086c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie                   (r300->screen->caps.is_r500 ?
1087c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie                   R500_PVS_CONST_START : R300_PVS_CONST_START) +
1088c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie                   buf->buffer_base + imm_first);
1089c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, imm_count * 4);
1090c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie        for (i = imm_first; i < imm_end; i++) {
1091c1365606c5b89872af4a0931e20f5cb78875eea6Dave Airlie            const float *data = vs->code.constants.Constants[i].u.Immediate;
1092abae06ac85349a30996257f29f9c52c3f687d35dMarek Olšák            OUT_CS_TABLE(data, 4);
1093abae06ac85349a30996257f29f9c52c3f687d35dMarek Olšák        }
1094abae06ac85349a30996257f29f9c52c3f687d35dMarek Olšák    }
10952db46af8758bf77a2748460f617d0ead5b08a454Maciej Cencora    END_CS;
1096188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnle}
1097188f8c679254f193cdcfcd4ef338f3c8c5e1146dNicolai Hähnle
1098841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_viewport_state(struct r300_context* r300,
1099841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                              unsigned size, void* state)
1100db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson{
110147f59cfc8eba6574c9ca0ae8799e8fbd9b393fb7Corbin Simpson    struct r300_viewport_state* viewport = (struct r300_viewport_state*)state;
1102db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson    CS_LOCALS(r300);
1103db83ee16474a7d9b23eacd7933366c5b320255a5Corbin Simpson
1104c037c376fbf468020caf2469e83e7a66c18e6f86Corbin Simpson    BEGIN_CS(size);
1105c037c376fbf468020caf2469e83e7a66c18e6f86Corbin Simpson    OUT_CS_REG_SEQ(R300_SE_VPORT_XSCALE, 6);
1106824c1f6a4a6d5ff2f93dee738f59173ffeb171f1Marek Olšák    OUT_CS_TABLE(&viewport->xscale, 6);
1107c037c376fbf468020caf2469e83e7a66c18e6f86Corbin Simpson    OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control);
1108c037c376fbf468020caf2469e83e7a66c18e6f86Corbin Simpson    END_CS;
1109015e7e7724a64d3d9e02e57f6a8eb88a6441f596Marek Olšák}
1110015e7e7724a64d3d9e02e57f6a8eb88a6441f596Marek Olšák
11116eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlievoid r300_emit_hiz_clear(struct r300_context *r300, unsigned size, void *state)
11126eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie{
11136eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    struct pipe_framebuffer_state *fb =
11146eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie        (struct pipe_framebuffer_state*)r300->fb_state.state;
111556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource* tex;
1116d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    CS_LOCALS(r300);
11176eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie
111856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    tex = r300_resource(fb->zsbuf->texture);
1119b55f6279370333574aa11c289f2ad9715cdca24dDave Airlie
1120d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    BEGIN_CS(size);
1121d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_HIZ, 2);
1122d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    OUT_CS(0);
1123d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    OUT_CS(tex->tex.hiz_dwords[fb->zsbuf->u.tex.level]);
1124790c73140939fb60c1b702215bb6afa09f401a8eMarek Olšák    OUT_CS(r300->hiz_clear_value);
1125d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    END_CS;
11266eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie
1127d5a86f9fc9fc96a0d771c0409b557636ef89f350Marek Olšák    /* Mark the current zbuffer's hiz ram as in use. */
1128d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    r300->hiz_in_use = TRUE;
1129ebf69f2c508e2cb6df1437ef0e31cbc8b808824dMarek Olšák    r300->hiz_func = HIZ_FUNC_NONE;
1130d99ec708afbb785ce05031661222b38c9447059fMarek Olšák    r300_mark_atom_dirty(r300, &r300->hyperz_state);
11316eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie}
11326eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie
11336eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlievoid r300_emit_zmask_clear(struct r300_context *r300, unsigned size, void *state)
11346eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie{
11356eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie    struct pipe_framebuffer_state *fb =
11366eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie        (struct pipe_framebuffer_state*)r300->fb_state.state;
113756ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex;
1138db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    CS_LOCALS(r300);
1139b55f6279370333574aa11c289f2ad9715cdca24dDave Airlie
114056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    tex = r300_resource(fb->zsbuf->texture);
11416eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie
1142db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    BEGIN_CS(size);
1143db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_ZMASK, 2);
1144db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    OUT_CS(0);
114556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    OUT_CS(tex->tex.zmask_dwords[fb->zsbuf->u.tex.level]);
1146db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    OUT_CS(0);
1147db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    END_CS;
11484f5e51068bce4e32a9561b4b4d6f3feca33642bfMarek Olšák
114959c2230879cb5149ce99ac8565ce6af9c5b02e04Marek Olšák    /* Mark the current zbuffer's zmask as in use. */
1150db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    r300->zmask_in_use = TRUE;
1151db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák    r300_mark_atom_dirty(r300, &r300->hyperz_state);
11526eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie}
11536eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie
1154841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšákvoid r300_emit_ztop_state(struct r300_context* r300,
1155841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák                          unsigned size, void* state)
11568a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson{
11578a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson    struct r300_ztop_state* ztop = (struct r300_ztop_state*)state;
11588a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson    CS_LOCALS(r300);
11598a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson
11604ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
11618a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson    OUT_CS_REG(R300_ZB_ZTOP, ztop->z_buffer_top);
11628a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson    END_CS;
11638a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson}
11648a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson
1165279715e76e5385afaad2834191e8578cf3a5d233Marek Olšákvoid r300_emit_texture_cache_inval(struct r300_context* r300, unsigned size, void* state)
1166b7219853af66085d859468e91606ae4ee5bae28eCorbin Simpson{
1167b7219853af66085d859468e91606ae4ee5bae28eCorbin Simpson    CS_LOCALS(r300);
1168b7219853af66085d859468e91606ae4ee5bae28eCorbin Simpson
11694ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák    BEGIN_CS(size);
1170b7219853af66085d859468e91606ae4ee5bae28eCorbin Simpson    OUT_CS_REG(R300_TX_INVALTAGS, 0);
1171b7219853af66085d859468e91606ae4ee5bae28eCorbin Simpson    END_CS;
1172b7219853af66085d859468e91606ae4ee5bae28eCorbin Simpson}
1173b7219853af66085d859468e91606ae4ee5bae28eCorbin Simpson
1174c3c5646b93eb20013d2739c7966da7ddad532877Marek Olšákboolean r300_emit_buffer_validate(struct r300_context *r300,
1175c3c5646b93eb20013d2739c7966da7ddad532877Marek Olšák                                  boolean do_validate_vertex_buffers,
1176c3c5646b93eb20013d2739c7966da7ddad532877Marek Olšák                                  struct pipe_resource *index_buffer)
11777961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson{
11781f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák    struct pipe_framebuffer_state *fb =
1179b9ae570bab5d0fefef93a9f6808603971304a74dCorbin Simpson        (struct pipe_framebuffer_state*)r300->fb_state.state;
1180d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák    struct r300_textures_state *texstate =
1181d2ac3d5e79bdf5a32a2dca135403d963ac6c83e4Marek Olšák        (struct r300_textures_state*)r300->textures_state.state;
118256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák    struct r300_resource *tex;
118376bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie    unsigned i;
11841f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák    boolean flushed = FALSE;
11851f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák
11861f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšákvalidate:
11871f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák    if (r300->fb_state.dirty) {
11881f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        /* Color buffers... */
11891f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        for (i = 0; i < fb->nr_cbufs; i++) {
119056ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex = r300_resource(fb->cbufs[i]->texture);
1191ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            assert(tex && tex->buf && "cbuf is marked, but NULL!");
1192363ff844753c46ac9c13866627e096b091ea81f8Marek Olšák            r300->rws->cs_add_reloc(r300->cs, tex->cs_buf,
119393f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                    RADEON_USAGE_READWRITE,
119493f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                    r300_surface(fb->cbufs[i])->domain);
1195afae0891949b72a2ede2a3b6a01d4d6bcf4ceae0Marek Olšák        }
11961f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        /* ...depth buffer... */
11971f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        if (fb->zsbuf) {
119856ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex = r300_resource(fb->zsbuf->texture);
1199ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák            assert(tex && tex->buf && "zsbuf is marked, but NULL!");
1200363ff844753c46ac9c13866627e096b091ea81f8Marek Olšák            r300->rws->cs_add_reloc(r300->cs, tex->cs_buf,
120193f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                    RADEON_USAGE_READWRITE,
120293f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                    r300_surface(fb->zsbuf)->domain);
12031f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        }
12041f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák    }
12051f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák    if (r300->textures_state.dirty) {
12061f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        /* ...textures... */
12071f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        for (i = 0; i < texstate->count; i++) {
12081f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák            if (!(texstate->tx_enable & (1 << i))) {
12091f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák                continue;
12101f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák            }
1211afae0891949b72a2ede2a3b6a01d4d6bcf4ceae0Marek Olšák
121256ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák            tex = r300_resource(texstate->sampler_views[i]->base.texture);
121393f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák            r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, RADEON_USAGE_READ,
121493f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                    tex->domain);
12151f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        }
121615601e970250e12f5d566ba782aae06d9714fbdcCorbin Simpson    }
1217a381ee82663f10ff3cdcfad331258d03d4188894Corbin Simpson    /* ...occlusion query buffer... */
1218fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák    if (r300->query_current)
1219ce9c0d280104c8001a3ee360b07218ad3d260e46Marek Olšák        r300->rws->cs_add_reloc(r300->cs, r300->query_current->cs_buf,
122093f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                RADEON_USAGE_WRITE, RADEON_DOMAIN_GTT);
1221d36e3952c21240cde19dac7f16cc37aac7174673Marek Olšák    /* ...vertex buffer for SWTCL path... */
1222fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák    if (r300->vbo)
122356ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        r300->rws->cs_add_reloc(r300->cs, r300_resource(r300->vbo)->cs_buf,
122493f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                RADEON_USAGE_READ,
122593f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                r300_resource(r300->vbo)->domain);
1226d36e3952c21240cde19dac7f16cc37aac7174673Marek Olšák    /* ...vertex buffers for HWTCL path... */
1227fd8d4b32ede6ebeae332539b71d38c36420e2654Marek Olšák    if (do_validate_vertex_buffers && r300->vertex_arrays_dirty) {
12282d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák        struct pipe_vertex_buffer *vbuf = r300->vertex_buffer;
12292d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák        struct pipe_vertex_buffer *last = r300->vertex_buffer +
12302d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák                                      r300->nr_vertex_buffers;
12310b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák        struct pipe_resource *buf;
12322d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák
12330b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák        for (; vbuf != last; vbuf++) {
12340b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák            buf = vbuf->buffer;
12350b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák            if (!buf)
12364953ba6a717ad1d3aa4426d147b52d05932c47abMarek Olšák                continue;
1237d36e3952c21240cde19dac7f16cc37aac7174673Marek Olšák
12380b3270b9b72c2ca4fad172752045d8fa93c1ad6eMarek Olšák            r300->rws->cs_add_reloc(r300->cs, r300_resource(buf)->cs_buf,
123993f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                    RADEON_USAGE_READ,
124093f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                    r300_resource(buf)->domain);
1241d36e3952c21240cde19dac7f16cc37aac7174673Marek Olšák        }
1242d36e3952c21240cde19dac7f16cc37aac7174673Marek Olšák    }
1243d36e3952c21240cde19dac7f16cc37aac7174673Marek Olšák    /* ...and index buffer for HWTCL path. */
1244fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák    if (index_buffer)
124556ba7e913fef0ea2b1bead582108f9ab3ab8263dMarek Olšák        r300->rws->cs_add_reloc(r300->cs, r300_resource(index_buffer)->cs_buf,
124693f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                RADEON_USAGE_READ,
124793f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633Marek Olšák                                r300_resource(index_buffer)->domain);
1248fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák
124964ab39b035f755510a644643b96451431bbe5f27Marek Olšák    /* Now do the validation (flush is called inside cs_validate on failure). */
1250fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák    if (!r300->rws->cs_validate(r300->cs)) {
12511f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        /* Ooops, an infinite loop, give up. */
12521f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        if (flushed)
12531f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák            return FALSE;
12541f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák
12551f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        flushed = TRUE;
12561f0348c4a2ba4f8ca812a2daccf3b01c3f984ef1Marek Olšák        goto validate;
1257c11ad489e7432f3ed2fcaf5b15b8fe3538ae6d30Corbin Simpson    }
1258c3c5646b93eb20013d2739c7966da7ddad532877Marek Olšák
1259c3c5646b93eb20013d2739c7966da7ddad532877Marek Olšák    return TRUE;
126076bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie}
126176bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie
1262e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšákunsigned r300_get_num_dirty_dwords(struct r300_context *r300)
126376bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie{
126476bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie    struct r300_atom* atom;
1265e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšák    unsigned dwords = 0;
126676bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie
126766d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák    foreach_dirty_atom(r300, atom) {
1268905fa3a07bdd3615e67b5d19708f96f124600066Marek Olšák        if (atom->dirty) {
126976bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie            dwords += atom->size;
127076bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie        }
127176bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie    }
127276bc66b664c7e135aa9c06cedd94ee1961d68c70Dave Airlie
1273847a24c011fda1fa21995a3e54848f15e75dccc9Marek Olšák    /* let's reserve some more, just in case */
1274847a24c011fda1fa21995a3e54848f15e75dccc9Marek Olšák    dwords += 32;
1275847a24c011fda1fa21995a3e54848f15e75dccc9Marek Olšák
1276e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšák    return dwords;
1277e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšák}
1278e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšák
12790d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšákunsigned r300_get_num_cs_end_dwords(struct r300_context *r300)
12800d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák{
12810d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák    unsigned dwords = 0;
12820d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák
12830d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák    /* Emitted in flush. */
12840d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák    dwords += 26; /* emit_query_end */
12850d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák    dwords += r300->hyperz_state.size + 2; /* emit_hyperz_end + zcache flush */
1286a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák    if (r300->screen->caps.is_r500)
1287cb925970eeade17016f59497d2123e4e8a447164Marek Olšák        dwords += 2;
12880d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák
12890d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák    return dwords;
12900d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák}
12910d699e8ee930c6c7e0f8abff14bf37e7f67807feMarek Olšák
1292e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšák/* Emit all dirty state. */
1293e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšákvoid r300_emit_dirty_state(struct r300_context* r300)
1294e6632b4bf7cba5fe8a77d54635a3b617fa67185fMarek Olšák{
129566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák    struct r300_atom *atom;
12967961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson
129766d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák    foreach_dirty_atom(r300, atom) {
1298905fa3a07bdd3615e67b5d19708f96f124600066Marek Olšák        if (atom->dirty) {
1299841122d0e8025290ff2691e13ade1099d2c3351cMarek Olšák            atom->emit(r300, atom->size, atom->state);
1300d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson            atom->dirty = FALSE;
1301d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson        }
13027961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson    }
13037961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson
130466d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák    r300->first_dirty = NULL;
130566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák    r300->last_dirty = NULL;
13064816764777485b46f360eb6f86dea243d1809221Corbin Simpson    r300->dirty_hw++;
13077961974fc28257b293961d35f15c0ce7a85f2669Corbin Simpson}
1308