1fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson/* 2fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> 3fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * 4fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * Permission is hereby granted, free of charge, to any person obtaining a 5fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * copy of this software and associated documentation files (the "Software"), 6fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * to deal in the Software without restriction, including without limitation 7fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * on the rights to use, copy, modify, merge, publish, distribute, sub 8fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * license, and/or sell copies of the Software, and to permit persons to whom 9fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * the Software is furnished to do so, subject to the following conditions: 10fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * 11fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * The above copyright notice and this permission notice (including the next 12fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * paragraph) shall be included in all copies or substantial portions of the 13fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * Software. 14fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * 15fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 22fb11fb897c2dc8cde64c84962d40e5fa6f384307Corbin Simpson 236a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "draw/draw_context.h" 246a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 256a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "util/u_memory.h" 26d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák#include "util/u_sampler.h" 27d70eb3851753ed7b57c56e4a7fd538857e4385ceEric Anholt#include "util/simple_list.h" 2868e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie#include "util/u_upload_mgr.h" 29fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák#include "os/os_time.h" 30ea78480029450c019287c2a94d7c42a6a1d12dc3Christian König#include "vl/vl_decoder.h" 314e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König#include "vl/vl_video_buffer.h" 326a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson 33f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák#include "r300_cb.h" 346a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_context.h" 35d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson#include "r300_emit.h" 366a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "r300_screen.h" 378bf9842fac00369b5cd3a82fb4d87db0e31848b8Marek Olšák#include "r300_screen_buffer.h" 38886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard#include "compiler/radeon_regalloc.h" 391ddb22675c123fc955ad3ab46bba45d3330d2ec4Nicolai Hähnle 40156b7e244c93e82f5d6b19caae1ec25e7f0e91bbMarek Olšák#include <inttypes.h> 41156b7e244c93e82f5d6b19caae1ec25e7f0e91bbMarek Olšák 42808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšákstatic void r300_release_referenced_objects(struct r300_context *r300) 43fc8a156cfc539b9c04dc3527e4fc61cb4b0b688eCorbin Simpson{ 44808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák struct pipe_framebuffer_state *fb = 45808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák (struct pipe_framebuffer_state*)r300->fb_state.state; 46808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák struct r300_textures_state *textures = 47808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák (struct r300_textures_state*)r300->textures_state.state; 48808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák unsigned i; 49808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák 50808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák /* Framebuffer state. */ 51a922725118333e016a357008f37105c23c6f54bcMarek Olšák util_unreference_framebuffer_state(fb); 52808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák 53808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák /* Textures. */ 54808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák for (i = 0; i < textures->sampler_view_count; i++) 55808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák pipe_sampler_view_reference( 56808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák (struct pipe_sampler_view**)&textures->sampler_views[i], NULL); 57da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson 58808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák /* The special dummy texture for texkill. */ 59d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák if (r300->texkill_sampler) { 60d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák pipe_sampler_view_reference( 6159df6725afd9c0d50cd962dd01db868be13284dbMarek Olšák (struct pipe_sampler_view**)&r300->texkill_sampler, 62d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák NULL); 63d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák } 64d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák 65307408a4f89be2613cac39c5f0cd776a71039965Marek Olšák /* Manually-created vertex buffers. */ 662d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák pipe_resource_reference(&r300->dummy_vb.buffer, NULL); 67ad1d1a4d9e4cb06424d477ddabac5885fa0613afMarek Olšák pb_reference(&r300->vbo, NULL); 68808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák 69db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák r300->context.delete_depth_stencil_alpha_state(&r300->context, 70db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák r300->dsa_decompress_zmask); 71808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák} 72808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák 73808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšákstatic void r300_destroy_context(struct pipe_context* context) 74808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák{ 75808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák struct r300_context* r300 = r300_context(context); 76808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák 77fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák if (r300->cs && r300->hyperz_enabled) { 78ce9daf6f0bda857c9ee5d021cfb444db6376bfe7Marek Olšák r300->rws->cs_request_feature(r300->cs, RADEON_FID_R300_HYPERZ_ACCESS, FALSE); 79fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák } 80ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák if (r300->cs && r300->cmask_access) { 81ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák r300->rws->cs_request_feature(r300->cs, RADEON_FID_R300_CMASK_ACCESS, FALSE); 82ca2c28859eca83f8fbf1f43616f5ef861e95e8d6Marek Olšák } 83fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák 841e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled if (r300->blitter) 851e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled util_blitter_destroy(r300->blitter); 86a82408c3537afe09e40b3ee6b3a6cb1acc62f715Jakob Bornecrantz if (r300->draw) 871e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled draw_destroy(r300->draw); 88da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson 898a963d122d4b67209214b0483084ba950814f42bMarek Olšák if (r300->uploader) 908a963d122d4b67209214b0483084ba950814f42bMarek Olšák u_upload_destroy(r300->uploader); 91e54cc2c070b30dd9b14bf9aedf93138b660c867fMarek Olšák 921e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled /* XXX: This function assumes r300->query_list was initialized */ 93808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák r300_release_referenced_objects(r300); 94808ad22592b4937e3c7c17793b2f891fb01c5dfbMarek Olšák 951e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled if (r300->cs) 961e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled r300->rws->cs_destroy(r300->cs); 9742d9f6323a523d786fc3797587fdf63048beccebMarek Olšák if (r300->ctx) 9842d9f6323a523d786fc3797587fdf63048beccebMarek Olšák r300->rws->ctx_destroy(r300->ctx); 99fe3caa91d3f637bf9cf9f9e7adb992aa8c7ef8e4Marek Olšák 100886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard rc_destroy_regalloc_state(&r300->fs_regalloc_state); 101886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard 1021e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled /* XXX: No way to tell if this was initialized or not? */ 103616e36674a1079dcfa131b3c9155cc473441b3deNicolai Hähnle slab_destroy_child(&r300->pool_transfers); 1047b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 1051e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled /* Free the structs allocated in r300_setup_atoms() */ 1061e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled if (r300->aa_state.state) { 1071e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->aa_state.state); 1081e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->blend_color_state.state); 1091e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->clip_state.state); 1101e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->fb_state.state); 1111e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->gpu_flush.state); 1121e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->hyperz_state.state); 1131e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->invariant_state.state); 1141e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->rs_block_state.state); 1158ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák FREE(r300->sample_mask.state); 1161e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->scissor_state.state); 1171e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->textures_state.state); 1181e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->vap_invariant_state.state); 1191e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->viewport_state.state); 1201e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->ztop_state.state); 1211e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->fs_constants.state); 1221e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->vs_constants.state); 123ecae1fca6f93eafb1916aa8621be04edd9228041Marek Olšák if (!r300->screen->caps.has_tcl) { 1241e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled FREE(r300->vertex_stream_state.state); 1251e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled } 126cf5dff1f2337303f49780dc646a44c6dbbe48e5aMarek Olšák } 127a08a830fd3c22bdbad1ee840e4e56302152375f1Corbin Simpson FREE(r300); 128da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson} 129da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson 13070cf6639c331342619e65c46db925d115bf51920Marek Olšákstatic void r300_flush_callback(void *data, unsigned flags, 13170cf6639c331342619e65c46db925d115bf51920Marek Olšák struct pipe_fence_handle **fence) 132210481ae16e966865dcf9f1fd5f5dfabf4dc28bcDave Airlie{ 133210481ae16e966865dcf9f1fd5f5dfabf4dc28bcDave Airlie struct r300_context* const cs_context_copy = data; 134210481ae16e966865dcf9f1fd5f5dfabf4dc28bcDave Airlie 13570cf6639c331342619e65c46db925d115bf51920Marek Olšák r300_flush(&cs_context_copy->context, flags, fence); 136210481ae16e966865dcf9f1fd5f5dfabf4dc28bcDave Airlie} 137210481ae16e966865dcf9f1fd5f5dfabf4dc28bcDave Airlie 138aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson#define R300_INIT_ATOM(atomname, atomsize) \ 139b0e1565b5f24c3f624745890170cce0700e620ffnobled do { \ 140fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák r300->atomname.name = #atomname; \ 141fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák r300->atomname.state = NULL; \ 142fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák r300->atomname.size = atomsize; \ 143fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák r300->atomname.emit = r300_emit_##atomname; \ 144fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák r300->atomname.dirty = FALSE; \ 145b0e1565b5f24c3f624745890170cce0700e620ffnobled } while (0) 146d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson 147d5bf23180664ccd682874ab628ed472e7c8c361anobled#define R300_ALLOC_ATOM(atomname, statetype) \ 148d5bf23180664ccd682874ab628ed472e7c8c361anobleddo { \ 149d5bf23180664ccd682874ab628ed472e7c8c361anobled r300->atomname.state = CALLOC_STRUCT(statetype); \ 150d5bf23180664ccd682874ab628ed472e7c8c361anobled if (r300->atomname.state == NULL) \ 151d5bf23180664ccd682874ab628ed472e7c8c361anobled return FALSE; \ 152d5bf23180664ccd682874ab628ed472e7c8c361anobled} while (0) 153d5bf23180664ccd682874ab628ed472e7c8c361anobled 154d5bf23180664ccd682874ab628ed472e7c8c361anobledstatic boolean r300_setup_atoms(struct r300_context* r300) 155d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson{ 156bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák boolean is_rv350 = r300->screen->caps.is_rv350; 157b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák boolean is_r500 = r300->screen->caps.is_r500; 158b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák boolean has_tcl = r300->screen->caps.has_tcl; 1594ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák 160aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson /* Create the actual atom list. 161aeb34b248903f98559209db4f095d1096ecb580aCorbin Simpson * 1624ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák * Some atoms never change size, others change every emit - those have 1630a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * the size of 0 here. 1640a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * 1650a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * NOTE: The framebuffer state is split into these atoms: 1660a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * - gpu_flush (unpipelined regs) 1670a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * - aa_state (unpipelined regs) 1680a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * - fb_state (unpipelined regs) 1690a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * - hyperz_state (unpipelined regs followed by pipelined ones) 1700a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * - fb_state_pipelined (pipelined regs) 1710a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * The motivation behind this is to be able to emit a strict 1720a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák * subset of the regs, and to have reasonable register ordering. */ 1730a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák /* SC, GB (unpipelined), RB3D (unpipelined), ZB (unpipelined). */ 17493bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák R300_INIT_ATOM(gpu_flush, 9); 17569adebf5945d994485c584c183c148fc2c1373edMarek Olšák R300_INIT_ATOM(aa_state, 4); 176a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák R300_INIT_ATOM(fb_state, 0); 177b7da8fa11d5c6ec71113350eed1959191a7d5990Marek Olšák R300_INIT_ATOM(hyperz_state, is_r500 || is_rv350 ? 10 : 8); 1780a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák /* ZB (unpipelined), SC. */ 179fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák R300_INIT_ATOM(ztop_state, 2); 180fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák /* ZB, FG. */ 181b7da8fa11d5c6ec71113350eed1959191a7d5990Marek Olšák R300_INIT_ATOM(dsa_state, is_r500 ? 10 : 6); 182fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák /* RB3D. */ 183fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák R300_INIT_ATOM(blend_state, 8); 1844ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák R300_INIT_ATOM(blend_color_state, is_r500 ? 3 : 2); 185fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák /* SC. */ 1868ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák R300_INIT_ATOM(sample_mask, 2); 187fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák R300_INIT_ATOM(scissor_state, 3); 188fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák /* GB, FG, GA, SU, SC, RB3D. */ 1898ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák R300_INIT_ATOM(invariant_state, 14 + (is_rv350 ? 4 : 0) + (is_r500 ? 4 : 0)); 190a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák /* VAP. */ 191fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák R300_INIT_ATOM(viewport_state, 9); 192fe6d3b9222ce184daab61ebb390a6af0b9889abfMarek Olšák R300_INIT_ATOM(pvs_flush, 2); 19302675622b02742960678c438f1b239321c075f50Max Staudt R300_INIT_ATOM(vap_invariant_state, is_r500 || !has_tcl ? 11 : 9); 194a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák R300_INIT_ATOM(vertex_stream_state, 0); 1954ed97f0a73db37f6105b6282d92646c3f66c2645Marek Olšák R300_INIT_ATOM(vs_state, 0); 1963da70606b3af1e907d56666d199957b6da0c73feMarek Olšák R300_INIT_ATOM(vs_constants, 0); 197dc4c821f0817a3db716f965692fb701079f66340Marek Olšák R300_INIT_ATOM(clip_state, has_tcl ? 3 + (6 * 4) : 0); 198c200c47e6c2f8581608b83e703d611db1bebd7f6Marek Olšák /* VAP, RS, GA, GB, SU, SC. */ 199a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák R300_INIT_ATOM(rs_block_state, 0); 200a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák R300_INIT_ATOM(rs_state, 0); 2010a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák /* SC, US. */ 202a6314eb47f0c916c51362dfbd0f1db21e72745eeMarek Olšák R300_INIT_ATOM(fb_state_pipelined, 8); 203a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák /* US. */ 20434092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák R300_INIT_ATOM(fs, 0); 2055633392966f56a75cb2a675ef9594e987c4591b9Marek Olšák R300_INIT_ATOM(fs_rc_constant_state, 0); 206136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšák R300_INIT_ATOM(fs_constants, 0); 207a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák /* TX. */ 208a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák R300_INIT_ATOM(texture_cache_inval, 2); 209a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák R300_INIT_ATOM(textures_state, 0); 2103f584c211a0587c4cf5e6d36275390cd7181b5c8Marek Olšák /* Clear commands */ 2117660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák R300_INIT_ATOM(hiz_clear, r300->screen->caps.hiz_ram > 0 ? 4 : 0); 2127660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák R300_INIT_ATOM(zmask_clear, r300->screen->caps.zmask_ram > 0 ? 4 : 0); 2137660529c44b3f6753e9b5636e876a3cd83c8ba51Marek Olšák R300_INIT_ATOM(cmask_clear, 4); 214a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák /* ZB (unpipelined), SU. */ 215a2f14153cc2bcf0b2364e035dc788d65ea0fcd35Marek Olšák R300_INIT_ATOM(query_start, 4); 21634092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák 21734092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák /* Replace emission functions for r500. */ 2185acdfdbf42a00352972f0f9cdd06188d0630b3dcMarek Olšák if (is_r500) { 21934092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák r300->fs.emit = r500_emit_fs; 2205633392966f56a75cb2a675ef9594e987c4591b9Marek Olšák r300->fs_rc_constant_state.emit = r500_emit_fs_rc_constant_state; 221136bd184a29945ab7ae0636ecef65e9db97f8e4dMarek Olšák r300->fs_constants.emit = r500_emit_fs_constants; 22234092c55d63e24a4f326bd9bb90765ea4ec7e17eMarek Olšák } 2232f5fcce933dd9beb66d2da4c1ca979ccde57483eMarek Olšák 2242f5fcce933dd9beb66d2da4c1ca979ccde57483eMarek Olšák /* Some non-CSO atoms need explicit space to store the state locally. */ 225d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(aa_state, r300_aa_state); 226d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(blend_color_state, r300_blend_color_state); 227d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(clip_state, r300_clip_state); 228d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(hyperz_state, r300_hyperz_state); 229d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(invariant_state, r300_invariant_state); 230d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(textures_state, r300_textures_state); 231d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(vap_invariant_state, r300_vap_invariant_state); 232d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(viewport_state, r300_viewport_state); 233d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(ztop_state, r300_ztop_state); 234d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(fb_state, pipe_framebuffer_state); 235d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(gpu_flush, pipe_framebuffer_state); 2368ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák r300->sample_mask.state = malloc(4); 237d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(scissor_state, pipe_scissor_state); 238d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(rs_block_state, r300_rs_block); 239d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(fs_constants, r300_constant_buffer); 240d5bf23180664ccd682874ab628ed472e7c8c361anobled R300_ALLOC_ATOM(vs_constants, r300_constant_buffer); 241cf5dff1f2337303f49780dc646a44c6dbbe48e5aMarek Olšák if (!r300->screen->caps.has_tcl) { 2420c9a63db095b32fdec8a8ff5f141b3418fbb9cceMarek Olšák R300_ALLOC_ATOM(vertex_stream_state, r300_vertex_stream_state); 243cf5dff1f2337303f49780dc646a44c6dbbe48e5aMarek Olšák } 24495ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák 24595ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák /* Some non-CSO atoms don't use the state pointer. */ 2460a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák r300->fb_state_pipelined.allow_null_state = TRUE; 24795ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák r300->fs_rc_constant_state.allow_null_state = TRUE; 24895ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák r300->pvs_flush.allow_null_state = TRUE; 24995ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák r300->query_start.allow_null_state = TRUE; 25095ba021105a2f1a29c8a4f51641c7a0b527226beMarek Olšák r300->texture_cache_inval.allow_null_state = TRUE; 2518959f48bce61dd92d23e91a2ca747f37dafd1301Marek Olšák 25262c631b20576ddee9a3c3d53709ca2932b0fbf9fMarek Olšák /* Some states must be marked as dirty here to properly set up 2538959f48bce61dd92d23e91a2ca747f37dafd1301Marek Olšák * hardware in the first command stream. */ 25466d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák r300_mark_atom_dirty(r300, &r300->invariant_state); 25566d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák r300_mark_atom_dirty(r300, &r300->pvs_flush); 25666d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák r300_mark_atom_dirty(r300, &r300->vap_invariant_state); 25766d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák r300_mark_atom_dirty(r300, &r300->texture_cache_inval); 25866d45567b4e2c6f2585789b68667e6c00b7567e1Marek Olšák r300_mark_atom_dirty(r300, &r300->textures_state); 259d5bf23180664ccd682874ab628ed472e7c8c361anobled 260d5bf23180664ccd682874ab628ed472e7c8c361anobled return TRUE; 261d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson} 262d496399156a7d9a683999e41f126232f89375f2bCorbin Simpson 2639dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák/* Not every state tracker calls every driver function before the first draw 2649dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák * call and we must initialize the command buffers somehow. */ 2659dd50993c6540729fe7c7397b4a947b3068db162Marek Olšákstatic void r300_init_states(struct pipe_context *pipe) 2669dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák{ 26793bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák struct r300_context *r300 = r300_context(pipe); 2689dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák struct pipe_blend_color bc = {{0}}; 2699dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák struct pipe_clip_state cs = {{{0}}}; 2709dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák struct pipe_scissor_state ss = {0}; 27193bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák struct r300_gpu_flush *gpuflush = 27293bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák (struct r300_gpu_flush*)r300->gpu_flush.state; 273fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák struct r300_vap_invariant_state *vap_invariant = 274fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák (struct r300_vap_invariant_state*)r300->vap_invariant_state.state; 275bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák struct r300_invariant_state *invariant = 276bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák (struct r300_invariant_state*)r300->invariant_state.state; 2776eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie 278f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák CB_LOCALS; 2799dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák 2809dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák pipe->set_blend_color(pipe, &bc); 281dc4c821f0817a3db716f965692fb701079f66340Marek Olšák pipe->set_clip_state(pipe, &cs); 282eaabb4ead07ae043ecc789024028e225ebd0f318Zack Rusin pipe->set_scissor_states(pipe, 0, 1, &ss); 2838ed6b1400bc8a78f46340f41aaf2e88b24c23267Marek Olšák pipe->set_sample_mask(pipe, ~0); 284f8032116293a1faf4dd76f2cbc10a455b8cde6d7Marek Olšák 28593bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák /* Initialize the GPU flush. */ 28693bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák { 28793bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák BEGIN_CB(gpuflush->cb_flush_clean, 6); 28893bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák 28993bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák /* Flush and free renderbuffer caches. */ 29093bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák OUT_CB_REG(R300_RB3D_DSTCACHE_CTLSTAT, 29193bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák R300_RB3D_DSTCACHE_CTLSTAT_DC_FREE_FREE_3D_TAGS | 29293bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D); 29393bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák OUT_CB_REG(R300_ZB_ZCACHE_CTLSTAT, 29493bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE | 29593bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE); 29693bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák 29793bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák /* Wait until the GPU is idle. 29893bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák * This fixes random pixels sometimes appearing probably caused 29993bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák * by incomplete rendering. */ 30093bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák OUT_CB_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); 30193bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák END_CB; 30293bce03b275f66b6b2db410bbef38954de6a617cMarek Olšák } 303fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák 304fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák /* Initialize the VAP invariant state. */ 305fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák { 306952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák BEGIN_CB(vap_invariant->cb, r300->vap_invariant_state.size); 307fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák OUT_CB_REG(VAP_PVS_VTX_TIMEOUT_REG, 0xffff); 308fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák OUT_CB_REG_SEQ(R300_VAP_GB_VERT_CLIP_ADJ, 4); 309fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák OUT_CB_32F(1.0); 310fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák OUT_CB_32F(1.0); 311fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák OUT_CB_32F(1.0); 312fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák OUT_CB_32F(1.0); 313fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák OUT_CB_REG(R300_VAP_PSC_SGN_NORM_CNTL, R300_SGN_NORM_NO_ZERO); 314952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák 315952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák if (r300->screen->caps.is_r500) { 316952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák OUT_CB_REG(R500_VAP_TEX_TO_COLOR_CNTL, 0); 31702675622b02742960678c438f1b239321c075f50Max Staudt } else if (!r300->screen->caps.has_tcl) { 31802675622b02742960678c438f1b239321c075f50Max Staudt /* RSxxx: 31902675622b02742960678c438f1b239321c075f50Max Staudt * Static VAP setup since r300_emit_vs_state() is never called. 32002675622b02742960678c438f1b239321c075f50Max Staudt */ 32102675622b02742960678c438f1b239321c075f50Max Staudt OUT_CB_REG(R300_VAP_CNTL, R300_PVS_NUM_SLOTS(10) | 32202675622b02742960678c438f1b239321c075f50Max Staudt R300_PVS_NUM_CNTLRS(5) | 32302675622b02742960678c438f1b239321c075f50Max Staudt R300_PVS_NUM_FPUS(2) | 32402675622b02742960678c438f1b239321c075f50Max Staudt R300_PVS_VF_MAX_VTX_NUM(5)); 325952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák } 326fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák END_CB; 327fcacc6a076ee5bc894eb7f5a7943715ff1ddf9eeMarek Olšák } 328bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák 329bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák /* Initialize the invariant state. */ 330bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák { 331bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák BEGIN_CB(invariant->cb, r300->invariant_state.size); 332bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R300_GB_SELECT, 0); 333bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R300_FG_FOG_BLEND, 0); 334bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R300_GA_OFFSET, 0); 335bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R300_SU_TEX_WRAP, 0); 336bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R300_SU_DEPTH_SCALE, 0x4B7FFFFF); 337bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R300_SU_DEPTH_OFFSET, 0); 338bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R300_SC_EDGERULE, 0x2DA49525); 339bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák 340bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák if (r300->screen->caps.is_rv350) { 341bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD, 0x01010101); 342bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák OUT_CB_REG(R500_RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD, 0xFEFEFEFE); 343bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák } 344952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák 345952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák if (r300->screen->caps.is_r500) { 346952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák OUT_CB_REG(R500_GA_COLOR_CONTROL_PS3, 0); 347952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák OUT_CB_REG(R500_SU_TEX_WRAP_PS3, 0); 348952222e4bfa957ec386e85909097c178829b6fd1Marek Olšák } 349bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák END_CB; 350bb47d1c26fa000735bd06751ba00a98354c921b7Marek Olšák } 3510a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák 3520a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák /* Initialize the hyperz state. */ 3530a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák { 3546eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie struct r300_hyperz_state *hyperz = 3556eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie (struct r300_hyperz_state*)r300->hyperz_state.state; 3566eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie BEGIN_CB(&hyperz->cb_flush_begin, r300->hyperz_state.size); 3576eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie OUT_CB_REG(R300_ZB_ZCACHE_CTLSTAT, 3586eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE); 3590a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák OUT_CB_REG(R300_ZB_BW_CNTL, 0); 3600a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák OUT_CB_REG(R300_ZB_DEPTHCLEARVALUE, 0); 3618c836f7f740c6f74511c727c7bed0680ddba9974Marek Olšák OUT_CB_REG(R300_SC_HYPERZ, R300_SC_HYPERZ_ADJ_2); 3626eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie 363b7da8fa11d5c6ec71113350eed1959191a7d5990Marek Olšák if (r300->screen->caps.is_r500 || r300->screen->caps.is_rv350) { 3646eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie OUT_CB_REG(R300_GB_Z_PEQ_CONFIG, 0); 3656eb2a7fbafd49e75b6cbbee57f23dda63eff73efDave Airlie } 3660a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák END_CB; 3670a19d57b845b269601c862193ed801b19aa4c2f1Marek Olšák } 3689dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák} 3699dd50993c6540729fe7c7397b4a947b3068db162Marek Olšák 370da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpsonstruct pipe_context* r300_create_context(struct pipe_screen* screen, 3710fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšák void *priv, unsigned flags) 372da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson{ 3733b37cb49b821dd0c59fd5361ada6c0df9ac07db8Corbin Simpson struct r300_context* r300 = CALLOC_STRUCT(r300_context); 3743445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora struct r300_screen* r300screen = r300_screen(screen); 375d35aeff4bb0b03450b2c3c08bd7f84db5bf43283Marek Olšák struct radeon_winsys *rws = r300screen->rws; 376da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson 3773b37cb49b821dd0c59fd5361ada6c0df9ac07db8Corbin Simpson if (!r300) 378da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson return NULL; 379da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson 38068e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie r300->rws = rws; 381b71bfc4400e1d7c15a2bebbbd3b26a8770fbf546Marek Olšák r300->screen = r300screen; 3829e67b0a1745e50fe34efedb0a3191b4a27e10724Corbin Simpson 383f13e507798cdbbe2fad5df33dcd581d49d6fa7abCorbin Simpson r300->context.screen = screen; 3847f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell r300->context.priv = priv; 385da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson 3863b37cb49b821dd0c59fd5361ada6c0df9ac07db8Corbin Simpson r300->context.destroy = r300_destroy_context; 387da1928d4a6d48e915960798015ed1f0c1fa95f0cCorbin Simpson 388616e36674a1079dcfa131b3c9155cc473441b3deNicolai Hähnle slab_create_child(&r300->pool_transfers, &r300screen->pool_transfers); 3897b31b235d069ab4154bfc4b1eacde6368852aaeeMarek Olšák 39042d9f6323a523d786fc3797587fdf63048beccebMarek Olšák r300->ctx = rws->ctx_create(rws); 39142d9f6323a523d786fc3797587fdf63048beccebMarek Olšák if (!r300->ctx) 39242d9f6323a523d786fc3797587fdf63048beccebMarek Olšák goto fail; 39342d9f6323a523d786fc3797587fdf63048beccebMarek Olšák 3948140154ae92c6bd022e409790bb069966a857aedMarek Olšák r300->cs = rws->cs_create(r300->ctx, RING_GFX, r300_flush_callback, r300); 3951e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled if (r300->cs == NULL) 3961e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled goto fail; 3971e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled 398e1c117d87bd1c77c6093a7a77b7994a8313b084eMarek Olšák if (!r300screen->caps.has_tcl) { 3991c181a7eff96816b5d72ea5daab5818eef0ebc60Corbin Simpson /* Create a Draw. This is used for SW TCL. */ 400e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul r300->draw = draw_create(&r300->context); 4017ed65f462aeebbdb7e48da365c947cd8a6ed9e5cnobled if (r300->draw == NULL) 4027ed65f462aeebbdb7e48da365c947cd8a6ed9e5cnobled goto fail; 4031c181a7eff96816b5d72ea5daab5818eef0ebc60Corbin Simpson /* Enable our renderer. */ 4041c181a7eff96816b5d72ea5daab5818eef0ebc60Corbin Simpson draw_set_rasterize_stage(r300->draw, r300_draw_stage(r300)); 4056a0ec833e4431445fe35230c0ab1d7dfdb997c64Marek Olšák /* Disable converting points/lines to triangles. */ 4066a0ec833e4431445fe35230c0ab1d7dfdb997c64Marek Olšák draw_wide_line_threshold(r300->draw, 10000000.f); 4076a0ec833e4431445fe35230c0ab1d7dfdb997c64Marek Olšák draw_wide_point_threshold(r300->draw, 10000000.f); 408ba86e03167c161e6f5d0d320571240ed55699ac0Marek Olšák draw_wide_point_sprites(r300->draw, FALSE); 409ba86e03167c161e6f5d0d320571240ed55699ac0Marek Olšák draw_enable_line_stipple(r300->draw, TRUE); 410ba86e03167c161e6f5d0d320571240ed55699ac0Marek Olšák draw_enable_point_sprites(r300->draw, FALSE); 4113445f476977ae403cef9ca15661fa0f96ff50ecaMaciej Cencora } 4121b77138a1effe2e18a9ce9e16c43852ff855a7beCorbin Simpson 413d5bf23180664ccd682874ab628ed472e7c8c361anobled if (!r300_setup_atoms(r300)) 414d5bf23180664ccd682874ab628ed472e7c8c361anobled goto fail; 4158a2c961798b4ab1f1095f14d814242422020d4f9Corbin Simpson 41685eede1b2f93333529d26a8f1e70eeac3bce76e1Marek Olšák r300_init_blit_functions(r300); 4171a5eea0c1e9ce6162ed6b07c337bffe62cb3c221Corbin Simpson r300_init_flush_functions(r300); 418d559796d6f13579ecf921a63d9f0c6c6342dc230Corbin Simpson r300_init_query_functions(r300); 41921a5a133fff3ab1a068a11a32144dcb63f1d5020Corbin Simpson r300_init_state_functions(r300); 420287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell r300_init_resource_functions(r300); 4216bede55241d8f672ba3d845e2ce1c00c7d65837eMarek Olšák r300_init_render_functions(r300); 4226bede55241d8f672ba3d845e2ce1c00c7d65837eMarek Olšák r300_init_states(&r300->context); 423da2123051c3923a2953cdd96f05ad684e7d3c8c3Marek Olšák 424f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König r300->context.create_video_codec = vl_create_decoder; 4254e837f557bf5f5afb286e1f2244ed69c0092c2d6Christian König r300->context.create_video_buffer = vl_video_buffer_create; 42621a5a133fff3ab1a068a11a32144dcb63f1d5020Corbin Simpson 42737d0aea772a39f9ae7fe3d791e23c1be03ccf9deMarek Olšák r300->uploader = u_upload_create(&r300->context, 256 * 1024, 428ecb2da1559bcb9a9eec7ac224c8ff47b026c95ffMarek Olšák PIPE_BIND_CUSTOM, PIPE_USAGE_STREAM); 429e54cc2c070b30dd9b14bf9aedf93138b660c867fMarek Olšák 43038a97148bf5df3c32087a5fdd799912d0275267dMarek Olšák r300->blitter = util_blitter_create(&r300->context); 4311e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled if (r300->blitter == NULL) 4321e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled goto fail; 4336bede55241d8f672ba3d845e2ce1c00c7d65837eMarek Olšák r300->blitter->draw_rectangle = r300_blitter_draw_rectangle; 43478e8a8765f435bf0902d62afbcb3b8d68a0b716fMarek Olšák 435d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák /* The KIL opcode needs the first texture unit to be enabled 436d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák * on r3xx-r4xx. In order to calm down the CS checker, we bind this 437d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák * dummy texture there. */ 438d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák if (!r300->screen->caps.is_r500) { 439d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák struct pipe_resource *tex; 440d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák struct pipe_resource rtempl = {{0}}; 441d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák struct pipe_sampler_view vtempl = {{0}}; 442d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák 443d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák rtempl.target = PIPE_TEXTURE_2D; 444d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák rtempl.format = PIPE_FORMAT_I8_UNORM; 445ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák rtempl.usage = PIPE_USAGE_IMMUTABLE; 446d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák rtempl.width0 = 1; 447d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák rtempl.height0 = 1; 448d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák rtempl.depth0 = 1; 449d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák tex = screen->resource_create(screen, &rtempl); 450d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák 451d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák u_sampler_view_default_template(&vtempl, tex, tex->format); 452d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák 453d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák r300->texkill_sampler = (struct r300_sampler_view*) 454d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák r300->context.create_sampler_view(&r300->context, tex, &vtempl); 455d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák 456d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák pipe_resource_reference(&tex, NULL); 457d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák } 458d82f6253331abf09ca714b844b1a9179ed8050b3Marek Olšák 4598a963d122d4b67209214b0483084ba950814f42bMarek Olšák if (r300screen->caps.has_tcl) { 460cbe47a2459c3b3a78a98038aed1990ec8627bb49Brian Paul struct pipe_resource vb; 461cbe47a2459c3b3a78a98038aed1990ec8627bb49Brian Paul memset(&vb, 0, sizeof(vb)); 462ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák vb.target = PIPE_BUFFER; 463ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák vb.format = PIPE_FORMAT_R8_UNORM; 464c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák vb.usage = PIPE_USAGE_DEFAULT; 465ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák vb.width0 = sizeof(float) * 16; 466ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák vb.height0 = 1; 467ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák vb.depth0 = 1; 468ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák 4692d03d4f4a365d7af5f4dac20700009152eba1682Marek Olšák r300->dummy_vb.buffer = screen->resource_create(screen, &vb); 470e3e1ffb2520498584ef402213d0c8aa4303a46a3Marek Olšák r300->context.set_vertex_buffers(&r300->context, 0, 1, &r300->dummy_vb); 471ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák } 472ffb732d8bd51f0a40379590a6485de2a56a2a306Marek Olšák 473db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák { 474cbe47a2459c3b3a78a98038aed1990ec8627bb49Brian Paul struct pipe_depth_stencil_alpha_state dsa; 475cbe47a2459c3b3a78a98038aed1990ec8627bb49Brian Paul memset(&dsa, 0, sizeof(dsa)); 476db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák dsa.depth.writemask = 1; 477db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 478db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák r300->dsa_decompress_zmask = 479db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák r300->context.create_depth_stencil_alpha_state(&r300->context, 480db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák &dsa); 481db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák } 482db299a9f8244d53d9041fcdbd396a77ebe1f9e3eMarek Olšák 483fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák r300->hyperz_time_of_last_flush = os_time_get(); 484fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák 485886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard /* Register allocator state */ 486886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard rc_init_regalloc_state(&r300->fs_regalloc_state); 487886a4d4a6ad8a67e02e67d5dd79ae37a592930c6Tom Stellard 48882e60236a950100bda7e00308c9b57861274608cMarek Olšák /* Print driver info. */ 489d99ec708afbb785ce05031661222b38c9447059fMarek Olšák#ifdef DEBUG 49082e60236a950100bda7e00308c9b57861274608cMarek Olšák { 491d99ec708afbb785ce05031661222b38c9447059fMarek Olšák#else 492d99ec708afbb785ce05031661222b38c9447059fMarek Olšák if (DBG_ON(r300, DBG_INFO)) { 49382e60236a950100bda7e00308c9b57861274608cMarek Olšák#endif 49482e60236a950100bda7e00308c9b57861274608cMarek Olšák fprintf(stderr, 49582e60236a950100bda7e00308c9b57861274608cMarek Olšák "r300: DRM version: %d.%d.%d, Name: %s, ID: 0x%04x, GB: %d, Z: %d\n" 496156b7e244c93e82f5d6b19caae1ec25e7f0e91bbMarek Olšák "r300: GART size: %"PRIu64" MB, VRAM size: %"PRIu64" MB\n" 497fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák "r300: AA compression RAM: %s, Z compression RAM: %s, HiZ RAM: %s\n", 49828a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.drm_major, 49928a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.drm_minor, 50028a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.drm_patchlevel, 50182e60236a950100bda7e00308c9b57861274608cMarek Olšák screen->get_name(screen), 50228a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.pci_id, 50328a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.r300_num_gb_pipes, 50428a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.r300_num_z_pipes, 50528a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.gart_size >> 20, 50628a336dc38c478b809544e7404c4d1fddd873333Marek Olšák r300->screen->info.vram_size >> 20, 507fdd37af3f76ea3ac32f21e9a9c41979a9b33cc5cMarek Olšák "YES", /* XXX really? */ 5082f665885cda87a533fb224cefaf7a9e98a084601Marek Olšák r300->screen->caps.zmask_ram ? "YES" : "NO", 50982e60236a950100bda7e00308c9b57861274608cMarek Olšák r300->screen->caps.hiz_ram ? "YES" : "NO"); 51082e60236a950100bda7e00308c9b57861274608cMarek Olšák } 51182e60236a950100bda7e00308c9b57861274608cMarek Olšák 5123b37cb49b821dd0c59fd5361ada6c0df9ac07db8Corbin Simpson return &r300->context; 51368e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie 51482e60236a950100bda7e00308c9b57861274608cMarek Olšákfail: 5151e2cd02eae9d27e48273f4a548dc51f4f838eb96nobled r300_destroy_context(&r300->context); 51668e58a96e80865878e6881dc4d34fcc3ec24eb19Dave Airlie return NULL; 517afe2de0a235f8e4312ecbb7275640502098a8a81Corbin Simpson} 518