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