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