1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 Marek Olšák <maraeo@gmail.com> 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* r300_emit: Functions for emitting state. */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_mm.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_context.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_cb.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_cs.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_emit.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_fs.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_screen.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_screen_buffer.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r300_vs.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_blend_state(struct r300_context* r300, 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_blend_state* blend = (struct r300_blend_state*)state; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state* fb = 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_framebuffer_state*)r300->fb_state.state; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->nr_cbufs) { 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT) { 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(blend->cb_noclamp, size); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swz = r300_surface(fb->cbufs[0])->colormask_swizzle; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(blend->cb_clamp[swz], size); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(blend->cb_no_readwrite, size); 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_blend_color_state(struct r300_context* r300, 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_blend_color_state* bc = (struct r300_blend_color_state*)state; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(bc->cb, size); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_clip_state(struct r300_context* r300, 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_clip_state* clip = (struct r300_clip_state*)state; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(clip->cb, size); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_dsa_state(struct r300_context* r300, unsigned size, void* state) 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_dsa_state* dsa = (struct r300_dsa_state*)state; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state* fb = 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_framebuffer_state*)r300->fb_state.state; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->zsbuf) { 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->nr_cbufs && fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(&dsa->cb_begin_fp16, size); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(&dsa->cb_begin, size); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->nr_cbufs && fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT) 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(dsa->cb_fp16_zb_no_readwrite, size); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(dsa->cb_zb_no_readwrite, size); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void get_rc_constant_state( 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float vec[4], 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_context * r300, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct rc_constant * constant) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_textures_state* texstate = r300->textures_state.state; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_resource *tex; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(constant->Type == RC_CONSTANT_STATE); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* vec should either be (0, 0, 0, 1), which should be a relatively safe 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * RGBA or STRQ value, or it could be one of the RC_CONSTANT_STATE 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * state factors. */ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (constant->u.State[0]) { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Factor for converting rectangle coords to 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * normalized coords. Should only show up on non-r500. */ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RC_STATE_R300_TEXRECT_FACTOR: 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(texstate->sampler_views[constant->u.State[1]]->base.texture); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[0] = 1.0 / tex->tex.width0; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[1] = 1.0 / tex->tex.height0; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[2] = 0; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[3] = 1; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RC_STATE_R300_TEXSCALE_FACTOR: 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(texstate->sampler_views[constant->u.State[1]]->base.texture); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Add a small number to the texture size to work around rounding errors in hw. */ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[0] = tex->b.b.width0 / (tex->tex.width0 + 0.001f); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[1] = tex->b.b.height0 / (tex->tex.height0 + 0.001f); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[2] = tex->b.b.depth0 / (tex->tex.depth0 + 0.001f); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[3] = 1; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RC_STATE_R300_VIEWPORT_SCALE: 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[0] = r300->viewport.scale[0]; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[1] = r300->viewport.scale[1]; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[2] = r300->viewport.scale[2]; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[3] = 1; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case RC_STATE_R300_VIEWPORT_OFFSET: 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[0] = r300->viewport.translate[0]; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[1] = r300->viewport.translate[1]; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[2] = r300->viewport.translate[2]; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[3] = 1; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: Implementation error: " 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Unknown RC_CONSTANT type %d\n", constant->u.State[0]); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[0] = 0; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[1] = 0; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[2] = 0; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec[3] = 1; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Convert a normal single-precision float into the 7.16 format 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * used by the R300 fragment shader. 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t pack_float24(float f) 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union { 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float fl; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t u; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } u; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float mantissa; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int exponent; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t float24 = 0; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f == 0.0) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u.fl = f; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mantissa = frexpf(f, &exponent); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Handle -ve */ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mantissa < 0) { 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float24 |= (1 << 23); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mantissa = mantissa * -1.0; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Handle exponent, bias of 63 */ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exponent += 62; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float24 |= (exponent << 16); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Kill 7 LSB of mantissa */ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float24 |= (u.u & 0x7FFFFF) >> 7; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return float24; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_fs(struct r300_context* r300, unsigned size, void *state) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_shader *fs = r300_fs(r300); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(fs->shader->cb_code, fs->shader->cb_code_size); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_fs_constants(struct r300_context* r300, unsigned size, void *state) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_shader *fs = r300_fs(r300); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = fs->shader->externals_count; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count == 0) 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_PFS_PARAM_0_X, count * 4); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buf->remap_table){ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *data = (float*)&buf->ptr[buf->remap_table[i]*4]; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(pack_float24(data[j])); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(pack_float24(*(float*)&buf->ptr[i*4+j])); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_fs_rc_constant_state(struct r300_context* r300, unsigned size, void *state) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_shader *fs = r300_fs(r300); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct rc_constant_list *constants = &fs->shader->code.constants; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = fs->shader->rc_state_count; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned first = fs->shader->externals_count; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned end = constants->Count; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned j; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count == 0) 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = first; i < end; ++i) { 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (constants->Constants[i].Type == RC_CONSTANT_STATE) { 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float data[4]; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_rc_constant_state(data, r300, &constants->Constants[i]); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_PFS_PARAM_0_X + i * 16, 4); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(pack_float24(data[j])); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r500_emit_fs(struct r300_context* r300, unsigned size, void *state) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_shader *fs = r300_fs(r300); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(fs->shader->cb_code, fs->shader->cb_code_size); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r500_emit_fs_constants(struct r300_context* r300, unsigned size, void *state) 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_shader *fs = r300_fs(r300); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = fs->shader->externals_count; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count == 0) 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R500_GA_US_VECTOR_INDEX, R500_GA_US_VECTOR_INDEX_TYPE_CONST); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, count * 4); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buf->remap_table){ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned i = 0; i < count; i++) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *data = &buf->ptr[buf->remap_table[i]*4]; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(data, 4); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(buf->ptr, count * 4); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r500_emit_fs_rc_constant_state(struct r300_context* r300, unsigned size, void *state) 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_shader *fs = r300_fs(r300); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct rc_constant_list *constants = &fs->shader->code.constants; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = fs->shader->rc_state_count; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned first = fs->shader->externals_count; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned end = constants->Count; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count == 0) 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = first; i < end; ++i) { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (constants->Constants[i].Type == RC_CONSTANT_STATE) { 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float data[4]; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_rc_constant_state(data, r300, &constants->Constants[i]); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R500_GA_US_VECTOR_INDEX, 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_GA_US_VECTOR_INDEX_TYPE_CONST | 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (i & R500_GA_US_VECTOR_INDEX_MASK)); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_ONE_REG(R500_GA_US_VECTOR_DATA, 4); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(data, 4); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_gpu_flush(struct r300_context *r300, unsigned size, void *state) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_gpu_flush *gpuflush = (struct r300_gpu_flush*)state; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state* fb = 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_framebuffer_state*)r300->fb_state.state; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t height = fb->height; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t width = fb->width; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->cbzb_clear) { 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_surface *surf = r300_surface(fb->cbufs[0]); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = surf->cbzb_height; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width = surf->cbzb_width; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_SCISSOR, 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "r300: Scissor width: %i, height: %i, CBZB clear: %s\n", 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, r300->cbzb_clear ? "YES" : "NO"); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up scissors. 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * By writing to the SC registers, SC & US assert idle. */ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_SC_SCISSORS_TL, 2); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(0); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(((width - 1) << R300_SCISSORS_X_SHIFT) | 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((height - 1) << R300_SCISSORS_Y_SHIFT)); 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS((1440 << R300_SCISSORS_X_SHIFT) | 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (1440 << R300_SCISSORS_Y_SHIFT)); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(((width + 1440-1) << R300_SCISSORS_X_SHIFT) | 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((height + 1440-1) << R300_SCISSORS_Y_SHIFT)); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Flush CB & ZB caches and wait until the 3D engine is idle and clean. */ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(gpuflush->cb_flush_clean, 6); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_aa_state(struct r300_context *r300, unsigned size, void *state) 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_aa_state *aa = (struct r300_aa_state*)state; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_GB_AA_CONFIG, aa->aa_config); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (aa->dest) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_RB3D_AARESOLVE_OFFSET, aa->dest->offset); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(aa->dest); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_RB3D_AARESOLVE_PITCH, aa->dest->pitch); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_RB3D_AARESOLVE_CTL, aa->aaresolve_ctl); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state) 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state* fb = (struct pipe_framebuffer_state*)state; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_surface* surf; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t rb3d_cctl = 0; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NUM_MULTIWRITES replicates COLOR[0] to all colorbuffers, which is not 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * what we usually want. */ 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500) { 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb3d_cctl = R300_RB3D_CCTL_INDEPENDENT_COLORFORMAT_ENABLE_ENABLE; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->nr_cbufs && r300->fb_multiwrite) { 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb3d_cctl |= R300_RB3D_CCTL_NUM_MULTIWRITES(fb->nr_cbufs); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_RB3D_CCTL, rb3d_cctl); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up colorbuffers. */ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < fb->nr_cbufs; i++) { 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf = r300_surface(fb->cbufs[i]); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_RB3D_COLOROFFSET0 + (4 * i), surf->offset); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_RB3D_COLORPITCH0 + (4 * i), surf->pitch); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up the ZB part of the CBZB clear. */ 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->cbzb_clear) { 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf = r300_surface(fb->cbufs[0]); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_FORMAT, surf->cbzb_format); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_DEPTHOFFSET, surf->cbzb_midpoint_offset); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_DEPTHPITCH, surf->cbzb_pitch); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_CBZB, 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "CBZB clearing cbuf %08x %08x\n", surf->cbzb_format, 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf->cbzb_pitch); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up a zbuffer. */ 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (fb->zsbuf) { 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf = r300_surface(fb->zsbuf); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_FORMAT, surf->format); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_DEPTHOFFSET, surf->offset); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_DEPTHPITCH, surf->pitch); 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->hyperz_enabled) { 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* HiZ RAM. */ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_HIZ_OFFSET, 0); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_HIZ_PITCH, surf->pitch_hiz); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Z Mask RAM. (compressed zbuffer) */ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZMASK_OFFSET, 0); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZMASK_PITCH, surf->pitch_zmask); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set up a dummy zbuffer. Otherwise occlusion queries won't work. 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Use the first colorbuffer, we will disable writes in the DSA state 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so as not to corrupt it. */ 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (fb->nr_cbufs) { 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf = r300_surface(fb->cbufs[0]); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_FORMAT, R300_DEPTHFORMAT_16BIT_INT_Z); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_DEPTHOFFSET, 0); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_DEPTHPITCH, 4 | R300_DEPTHMICROTILE_TILED_SQUARE); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(surf); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_hyperz_state(struct r300_context *r300, 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void *state) 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_hyperz_state *z = state; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (z->flush) 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(&z->cb_flush_begin, size); 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(&z->cb_begin, size - 2); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_hyperz_end(struct r300_context *r300) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_hyperz_state z = 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *(struct r300_hyperz_state*)r300->hyperz_state.state; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z.flush = 1; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z.zb_bw_cntl = 0; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z.zb_depthclearvalue = 0; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z.sc_hyperz = R300_SC_HYPERZ_ADJ_2; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z.gb_z_peq_config = 0; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_emit_hyperz_state(r300, r300->hyperz_state.size, &z); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_fb_state_pipelined(struct r300_context *r300, 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void *state) 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state* fb = 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_framebuffer_state*)r300->fb_state.state; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, num_cbufs = fb->nr_cbufs; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mspos0, mspos1; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we use the multiwrite feature, the colorbuffers 2,3,4 must be 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * marked as UNUSED in the US block. */ 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->fb_multiwrite) { 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_cbufs = MIN2(num_cbufs, 1); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Colorbuffer format in the US block. 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (must be written after unpipelined regs) */ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_US_OUT_FMT_0, 4); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_cbufs; i++) { 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(r300_surface(fb->cbufs[i])->format); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < 1; i++) { 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(R300_US_OUT_FMT_C4_8 | 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_C0_SEL_B | R300_C1_SEL_G | 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_C2_SEL_R | R300_C3_SEL_A); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < 4; i++) { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(R300_US_OUT_FMT_UNUSED); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Multisampling. Depends on framebuffer sample count. 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These are pipelined regs and as such cannot be moved 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the AA state. */ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos0 = 0x66666666; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos1 = 0x6666666; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->nr_cbufs && fb->cbufs[0]->texture->nr_samples > 1) { 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Subsample placement. These may not be optimal. */ 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (fb->cbufs[0]->texture->nr_samples) { 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos0 = 0x33996633; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos1 = 0x6666663; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos0 = 0x33936933; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos1 = 0x6666663; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos0 = 0x33939933; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos1 = 0x3966663; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 6: 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos0 = 0x22a2aa22; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mspos1 = 0x2a65672; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("r300: Bad number of multisamples!\n"); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_GB_MSPOS0, 2); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(mspos0); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(mspos1); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_query_start(struct r300_context *r300, unsigned size, void*state) 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_query *query = r300->query_current; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!query) 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.family == CHIP_FAMILY_RV530) { 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_ALL); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_DATA, 0); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->begin_emitted = TRUE; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r300_emit_query_end_frag_pipes(struct r300_context *r300, 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_query *query) 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_capabilities* caps = &r300->screen->caps; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t gb_pipes = r300->screen->info.r300_num_gb_pipes; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(gb_pipes); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(6 * gb_pipes + 2); 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* I'm not so sure I like this switch, but it's hard to be elegant 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * when there's so many special cases... 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * So here's the basic idea. For each pipe, enable writes to it only, 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * then put out the relocation for ZPASS_ADDR, taking into account a 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4-byte offset for each pipe. RV380 and older are special; they have 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * only two pipes, and the second pipe's enable is on bit 3, not bit 1, 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so there's a chipset cap for that. */ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (gb_pipes) { 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pipe 3 only */ 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_SU_REG_DEST, 1 << 3); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 3) * 4); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300->query_current); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pipe 2 only */ 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_SU_REG_DEST, 1 << 2); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 2) * 4); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300->query_current); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pipe 1 only */ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* As mentioned above, accomodate RV380 and older. */ 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_SU_REG_DEST, 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 << (caps->high_second_pipe ? 3 : 1)); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 1) * 4); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300->query_current); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pipe 0 only */ 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_SU_REG_DEST, 1 << 0); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 0) * 4); 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300->query_current); 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: Implementation error: Chipset reports %d" 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " pixel pipes!\n", gb_pipes); 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org abort(); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* And, finally, reset it to normal... */ 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_SU_REG_DEST, 0xF); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void rv530_emit_query_end_single_z(struct r300_context *r300, 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_query *query) 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(8); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_0); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_ADDR, query->num_results * 4); 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300->query_current); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void rv530_emit_query_end_double_z(struct r300_context *r300, 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_query *query) 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(14); 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_0); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 0) * 4); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300->query_current); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_1); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZPASS_ADDR, (query->num_results + 1) * 4); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300->query_current); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL); 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_query_end(struct r300_context* r300) 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_capabilities *caps = &r300->screen->caps; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_query *query = r300->query_current; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!query) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (query->begin_emitted == FALSE) 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (caps->family == CHIP_FAMILY_RV530) { 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->info.r300_num_z_pipes == 2) 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rv530_emit_query_end_double_z(r300, query); 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rv530_emit_query_end_single_z(r300, query); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_emit_query_end_frag_pipes(r300, query); 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->begin_emitted = FALSE; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->num_results += query->num_pipes; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX grab all the results and reset the counter. */ 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (query->num_results >= query->buf->size / 4 - 4) { 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query->num_results = (query->buf->size / 4) / 2; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: Rewinding OQBO...\n"); 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_invariant_state(struct r300_context *r300, 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void *state) 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(state, size); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_rs_state(struct r300_context* r300, unsigned size, void* state) 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_rs_state* rs = state; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(rs->cb_main, RS_STATE_MAIN_SIZE); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rs->polygon_offset_enable) { 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->zbuffer_bpp == 16) { 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(rs->cb_poly_offset_zb16, 5); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(rs->cb_poly_offset_zb24, 5); 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_rs_block_state(struct r300_context* r300, 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_rs_block* rs = (struct r300_rs_block*)state; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* It's the same for both INST and IP tables */ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = (rs->inst_count & R300_RS_INST_COUNT_MASK) + 1; 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (DBG_ON(r300, DBG_RS_BLOCK)) { 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r500_dump_rs_block(rs); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: RS emit:\n"); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " : ip %d: 0x%08x\n", i, rs->ip[i]); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " : inst %d: 0x%08x\n", i, rs->inst[i]); 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " : count: 0x%08x inst_count: 0x%08x\n", 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rs->count, rs->inst_count); 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_VAP_VTX_STATE_CNTL, 2); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(rs->vap_vtx_state_cntl); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(rs->vap_vsm_vtx_assm); 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_VAP_OUTPUT_VTX_FMT_0, 2); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(rs->vap_out_vtx_fmt[0]); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(rs->vap_out_vtx_fmt[1]); 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_GB_ENABLE, 1); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(rs->gb_enable); 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500) { 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R500_RS_IP_0, count); 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_RS_IP_0, count); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(rs->ip, count); 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_RS_COUNT, 2); 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(rs->count); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(rs->inst_count); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500) { 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R500_RS_INST_0, count); 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_RS_INST_0, count); 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(rs->inst, count); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_scissor_state(struct r300_context* r300, 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_scissor_state* scissor = (struct pipe_scissor_state*)state; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_SC_CLIPRECT_TL_0, 2); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500) { 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS((scissor->minx << R300_CLIPRECT_X_SHIFT) | 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (scissor->miny << R300_CLIPRECT_Y_SHIFT)); 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(((scissor->maxx - 1) << R300_CLIPRECT_X_SHIFT) | 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((scissor->maxy - 1) << R300_CLIPRECT_Y_SHIFT)); 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(((scissor->minx + 1440) << R300_CLIPRECT_X_SHIFT) | 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((scissor->miny + 1440) << R300_CLIPRECT_Y_SHIFT)); 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(((scissor->maxx + 1440-1) << R300_CLIPRECT_X_SHIFT) | 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((scissor->maxy + 1440-1) << R300_CLIPRECT_Y_SHIFT)); 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_textures_state(struct r300_context *r300, 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void *state) 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_textures_state *allstate = (struct r300_textures_state*)state; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_texture_sampler_state *texstate; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_resource *tex; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean has_us_format = r300->screen->caps.has_us_format; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_ENABLE, allstate->tx_enable); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < allstate->count; i++) { 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((1 << i) & allstate->tx_enable) { 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate = &allstate->regs[i]; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(allstate->sampler_views[i]->base.texture); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_FILTER0_0 + (i * 4), texstate->filter0); 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_FILTER1_0 + (i * 4), texstate->filter1); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_BORDER_COLOR_0 + (i * 4), 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->border_color); 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_FORMAT0_0 + (i * 4), texstate->format.format0); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_FORMAT1_0 + (i * 4), texstate->format.format1); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_FORMAT2_0 + (i * 4), texstate->format.format2); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_OFFSET_0 + (i * 4), texstate->format.tile_config); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(tex); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (has_us_format) { 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R500_US_FORMAT0_0 + (i * 4), 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texstate->format.us_format0); 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_vertex_arrays(struct r300_context* r300, int offset, 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean indexed, int instance_id) 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vbuf = r300->vertex_buffer; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element *velem = r300->velems->velem; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_resource *buf; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vertex_array_count = r300->velems->count; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned packet_size = (vertex_array_count * 3 + 1) / 2; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vb1, *vb2; 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *hw_format_size = r300->velems->format_size; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size1, size2, offset1, offset2, stride1, stride2; 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(2 + packet_size + vertex_array_count * 2); 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_PKT3(R300_PACKET3_3D_LOAD_VBPNTR, packet_size); 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(vertex_array_count | (!indexed ? R300_VC_FORCE_PREFETCH : 0)); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (instance_id == -1) { 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Non-instanced arrays. This ignores instance_divisor and instance_id. */ 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vertex_array_count - 1; i += 2) { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb1 = &vbuf[velem[i].vertex_buffer_index]; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb2 = &vbuf[velem[i+1].vertex_buffer_index]; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size1 = hw_format_size[i]; 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size2 = hw_format_size[i+1]; 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(vb1->stride) | 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_VBPNTR_SIZE1(size2) | R300_VBPNTR_STRIDE1(vb2->stride)); 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride); 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(vb2->buffer_offset + velem[i+1].src_offset + offset * vb2->stride); 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vertex_array_count & 1) { 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb1 = &vbuf[velem[i].vertex_buffer_index]; 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size1 = hw_format_size[i]; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(vb1->stride)); 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride); 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vertex_array_count; i++) { 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf = r300_resource(vbuf[velem[i].vertex_buffer_index].buffer); 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(buf); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Instanced arrays. */ 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vertex_array_count - 1; i += 2) { 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb1 = &vbuf[velem[i].vertex_buffer_index]; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb2 = &vbuf[velem[i+1].vertex_buffer_index]; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size1 = hw_format_size[i]; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size2 = hw_format_size[i+1]; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (velem[i].instance_divisor) { 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride1 = 0; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset1 = vb1->buffer_offset + velem[i].src_offset + 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (instance_id / velem[i].instance_divisor) * vb1->stride; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride1 = vb1->stride; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset1 = vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (velem[i+1].instance_divisor) { 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride2 = 0; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset2 = vb2->buffer_offset + velem[i+1].src_offset + 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (instance_id / velem[i+1].instance_divisor) * vb2->stride; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride2 = vb2->stride; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset2 = vb2->buffer_offset + velem[i+1].src_offset + offset * vb2->stride; 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(stride1) | 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_VBPNTR_SIZE1(size2) | R300_VBPNTR_STRIDE1(stride2)); 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(offset1); 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(offset2); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vertex_array_count & 1) { 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb1 = &vbuf[velem[i].vertex_buffer_index]; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size1 = hw_format_size[i]; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (velem[i].instance_divisor) { 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride1 = 0; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset1 = vb1->buffer_offset + velem[i].src_offset + 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (instance_id / velem[i].instance_divisor) * vb1->stride; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride1 = vb1->stride; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset1 = vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(stride1)); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(offset1); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < vertex_array_count; i++) { 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf = r300_resource(vbuf[velem[i].vertex_buffer_index].buffer); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(buf); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_vertex_arrays_swtcl(struct r300_context *r300, boolean indexed) 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DBG(r300, DBG_SWTCL, "r300: Preparing vertex buffer %p for render, " 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "vertex size %d\n", r300->vbo, 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->vertex_info.size); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the pointer to our vertex buffer. The emitted values are this: 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PACKET3 [3D_LOAD_VBPNTR] 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * COUNT [1] 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FORMAT [size | stride << 8] 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OFFSET [offset into BO] 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VBPNTR [relocated BO] 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(7); 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_PKT3(R300_PACKET3_3D_LOAD_VBPNTR, 3); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(1 | (!indexed ? R300_VC_FORCE_PREFETCH : 0)); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(r300->vertex_info.size | 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (r300->vertex_info.size << 8)); 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(r300->draw_vbo_offset); 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(0); 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_RELOC(r300_resource(r300->vbo)); 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_vertex_stream_state(struct r300_context* r300, 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_stream_state *streams = 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct r300_vertex_stream_state*)state; 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (DBG_ON(r300, DBG_PSC)) { 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "r300: PSC emit:\n"); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < streams->count; i++) { 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " : prog_stream_cntl%d: 0x%08x\n", i, 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org streams->vap_prog_stream_cntl[i]); 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < streams->count; i++) { 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " : prog_stream_cntl_ext%d: 0x%08x\n", i, 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org streams->vap_prog_stream_cntl_ext[i]); 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_VAP_PROG_STREAM_CNTL_0, streams->count); 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(streams->vap_prog_stream_cntl, streams->count); 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_VAP_PROG_STREAM_CNTL_EXT_0, streams->count); 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(streams->vap_prog_stream_cntl_ext, streams->count); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_pvs_flush(struct r300_context* r300, unsigned size, void* state) 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0x0); 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_vap_invariant_state(struct r300_context *r300, 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void *state) 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WRITE_CS_TABLE(state, size); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_vs_state(struct r300_context* r300, unsigned size, void* state) 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_shader* vs = (struct r300_vertex_shader*)state; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_program_code* code = &vs->code; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_screen* r300screen = r300->screen; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned instruction_count = code->length / 4; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vtx_mem_size = r300screen->caps.is_r500 ? 128 : 72; 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned input_count = MAX2(util_bitcount(code->InputsRead), 1); 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned output_count = MAX2(util_bitcount(code->OutputsWritten), 1); 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned temp_count = MAX2(code->num_temporaries, 1); 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned pvs_num_slots = MIN3(vtx_mem_size / input_count, 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtx_mem_size / output_count, 10); 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned pvs_num_controllers = MIN2(vtx_mem_size / temp_count, 5); 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R300_VAP_PVS_CODE_CNTL_0 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * R300_VAP_PVS_CONST_CNTL 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * R300_VAP_PVS_CODE_CNTL_1 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See the r5xx docs for instructions on how to use these. */ 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_CODE_CNTL_0, R300_PVS_FIRST_INST(0) | 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_PVS_XYZW_VALID_INST(instruction_count - 1) | 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_PVS_LAST_INST(instruction_count - 1)); 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_CODE_CNTL_1, instruction_count - 1); 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG, 0); 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, code->length); 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(code->body.d, code->length); 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(pvs_num_slots) | 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_PVS_NUM_CNTLRS(pvs_num_controllers) | 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_PVS_NUM_FPUS(r300screen->caps.num_vert_fpus) | 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_PVS_VF_MAX_VTX_NUM(12) | 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (r300screen->caps.is_r500 ? R500_TCL_STATE_OPTIMIZATION : 0)); 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit flow control instructions. Even if there are no fc instructions, 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we still need to write the registers to make sure they are cleared. */ 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_FLOW_CNTL_OPC, code->fc_ops); 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300screen->caps.is_r500) { 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R500_VAP_PVS_FLOW_CNTL_ADDRS_LW_0, R300_VS_MAX_FC_OPS * 2); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(code->fc_op_addrs.r500, R300_VS_MAX_FC_OPS * 2); 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_ADDRS_0, R300_VS_MAX_FC_OPS); 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(code->fc_op_addrs.r300, R300_VS_MAX_FC_OPS); 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_VAP_PVS_FLOW_CNTL_LOOP_INDEX_0, R300_VS_MAX_FC_OPS); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(code->fc_loop_index, R300_VS_MAX_FC_OPS); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_vs_constants(struct r300_context* r300, 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void *state) 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count = 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((struct r300_vertex_shader*)r300->vs_state.state)->externals_count; 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_shader *vs = (struct r300_vertex_shader*)r300->vs_state.state; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int imm_first = vs->externals_count; 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int imm_end = vs->code.constants.Count; 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int imm_count = vs->immediates_count; 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_CONST_CNTL, 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_PVS_CONST_BASE_OFFSET(buf->buffer_base) | 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R300_PVS_MAX_CONST_ADDR(MAX2(imm_end - 1, 0))); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vs->externals_count) { 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG, 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (r300->screen->caps.is_r500 ? 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_PVS_CONST_START : R300_PVS_CONST_START) + buf->buffer_base); 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, count * 4); 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buf->remap_table){ 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *data = &buf->ptr[buf->remap_table[i]*4]; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(data, 4); 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(buf->ptr, count * 4); 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit immediates. */ 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (imm_count) { 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_PVS_VECTOR_INDX_REG, 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (r300->screen->caps.is_r500 ? 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org R500_PVS_CONST_START : R300_PVS_CONST_START) + 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf->buffer_base + imm_first); 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, imm_count * 4); 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = imm_first; i < imm_end; i++) { 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *data = vs->code.constants.Constants[i].u.Immediate; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(data, 4); 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_viewport_state(struct r300_context* r300, 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_viewport_state* viewport = (struct r300_viewport_state*)state; 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG_SEQ(R300_SE_VPORT_XSCALE, 6); 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_TABLE(&viewport->xscale, 6); 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_VAP_VTE_CNTL, viewport->vte_control); 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_hiz_clear(struct r300_context *r300, unsigned size, void *state) 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_framebuffer_state*)r300->fb_state.state; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_resource* tex; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(fb->zsbuf->texture); 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_HIZ, 2); 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(0); 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(tex->tex.hiz_dwords[fb->zsbuf->u.tex.level]); 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(r300->hiz_clear_value); 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Mark the current zbuffer's hiz ram as in use. */ 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->hiz_in_use = TRUE; 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->hiz_func = HIZ_FUNC_NONE; 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_mark_atom_dirty(r300, &r300->hyperz_state); 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_zmask_clear(struct r300_context *r300, unsigned size, void *state) 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_framebuffer_state*)r300->fb_state.state; 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_resource *tex; 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(fb->zsbuf->texture); 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_ZMASK, 2); 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(0); 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(tex->tex.zmask_dwords[fb->zsbuf->u.tex.level]); 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS(0); 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Mark the current zbuffer's zmask as in use. */ 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->zmask_in_use = TRUE; 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_mark_atom_dirty(r300, &r300->hyperz_state); 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_ztop_state(struct r300_context* r300, 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, void* state) 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_ztop_state* ztop = (struct r300_ztop_state*)state; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_ZB_ZTOP, ztop->z_buffer_top); 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_texture_cache_inval(struct r300_context* r300, unsigned size, void* state) 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CS_LOCALS(r300); 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_CS(size); 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OUT_CS_REG(R300_TX_INVALTAGS, 0); 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_CS; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean r300_emit_buffer_validate(struct r300_context *r300, 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean do_validate_vertex_buffers, 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *index_buffer) 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_framebuffer_state *fb = 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct pipe_framebuffer_state*)r300->fb_state.state; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_textures_state *texstate = 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (struct r300_textures_state*)r300->textures_state.state; 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_resource *tex; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean flushed = FALSE; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvalidate: 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->fb_state.dirty) { 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Color buffers... */ 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < fb->nr_cbufs; i++) { 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(fb->cbufs[i]->texture); 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex && tex->buf && "cbuf is marked, but NULL!"); 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_USAGE_READWRITE, 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_surface(fb->cbufs[i])->domain); 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ...depth buffer... */ 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fb->zsbuf) { 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(fb->zsbuf->texture); 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tex && tex->buf && "zsbuf is marked, but NULL!"); 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_USAGE_READWRITE, 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_surface(fb->zsbuf)->domain); 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->textures_state.dirty) { 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ...textures... */ 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < texstate->count; i++) { 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(texstate->tx_enable & (1 << i))) { 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex = r300_resource(texstate->sampler_views[i]->base.texture); 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, RADEON_USAGE_READ, 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->domain); 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ...occlusion query buffer... */ 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->query_current) 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rws->cs_add_reloc(r300->cs, r300->query_current->cs_buf, 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_USAGE_WRITE, RADEON_DOMAIN_GTT); 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ...vertex buffer for SWTCL path... */ 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->vbo) 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rws->cs_add_reloc(r300->cs, r300_resource(r300->vbo)->cs_buf, 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_USAGE_READ, 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_resource(r300->vbo)->domain); 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ...vertex buffers for HWTCL path... */ 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (do_validate_vertex_buffers && r300->vertex_arrays_dirty) { 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vbuf = r300->vertex_buffer; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *last = r300->vertex_buffer + 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->nr_vertex_buffers; 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buf; 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; vbuf != last; vbuf++) { 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf = vbuf->buffer; 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buf) 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rws->cs_add_reloc(r300->cs, r300_resource(buf)->cs_buf, 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_USAGE_READ, 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_resource(buf)->domain); 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ...and index buffer for HWTCL path. */ 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index_buffer) 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->rws->cs_add_reloc(r300->cs, r300_resource(index_buffer)->cs_buf, 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RADEON_USAGE_READ, 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300_resource(index_buffer)->domain); 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now do the validation (flush is called inside cs_validate on failure). */ 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!r300->rws->cs_validate(r300->cs)) { 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Ooops, an infinite loop, give up. */ 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flushed) 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flushed = TRUE; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto validate; 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned r300_get_num_dirty_dwords(struct r300_context *r300) 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_atom* atom; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dwords = 0; 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org foreach_dirty_atom(r300, atom) { 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (atom->dirty) { 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwords += atom->size; 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* let's reserve some more, just in case */ 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwords += 32; 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dwords; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned r300_get_num_cs_end_dwords(struct r300_context *r300) 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dwords = 0; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emitted in flush. */ 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwords += 26; /* emit_query_end */ 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwords += r300->hyperz_state.size + 2; /* emit_hyperz_end + zcache flush */ 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (r300->screen->caps.is_r500) 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dwords += 2; 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dwords; 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Emit all dirty state. */ 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_emit_dirty_state(struct r300_context* r300) 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_atom *atom; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org foreach_dirty_atom(r300, atom) { 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (atom->dirty) { 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org atom->emit(r300, atom->size, atom->state); 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org atom->dirty = FALSE; 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->first_dirty = NULL; 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->last_dirty = NULL; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r300->dirty_hw++; 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1308