r600_pipe_common.c revision b6847062dd5c504023dfbef8e6b3118136ee506c
1d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák/*
2d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * Copyright 2013 Advanced Micro Devices, Inc.
3d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák *
4d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a
5d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * copy of this software and associated documentation files (the "Software"),
6d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * to deal in the Software without restriction, including without limitation
7d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * and/or sell copies of the Software, and to permit persons to whom the
9d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * Software is furnished to do so, subject to the following conditions:
10d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák *
11d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * The above copyright notice and this permission notice (including the next
12d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * paragraph) shall be included in all copies or substantial portions of the
13d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * Software.
14d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák *
15d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * SOFTWARE.
22d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák *
23d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák * Authors: Marek Olšák <maraeo@gmail.com>
24d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák *
25d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák */
26d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
27d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák#include "r600_pipe_common.h"
28e64633e8c3a5498998a45ab721bf80edca101cf5Marek Olšák#include "r600_cs.h"
290cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák#include "tgsi/tgsi_parse.h"
308a125afa6e88a3eeddba8c7fdc1a75c9b99d5489Nicolai Hähnle#include "util/list.h"
31db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák#include "util/u_draw_quad.h"
32ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák#include "util/u_memory.h"
331bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák#include "util/u_format_s3tc.h"
3491aca8c662faf0ec311968b2897a72a6d08b199dMarek Olšák#include "util/u_upload_mgr.h"
353b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák#include "os/os_time.h"
36d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák#include "vl/vl_decoder.h"
37d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák#include "vl/vl_video_buffer.h"
387bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include "radeon/radeon_video.h"
394c110994533c67f2e501cd32ee0c2f91060630e0Emil Velikov#include <inttypes.h>
40d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
41bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák#ifndef HAVE_LLVM
42bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák#define HAVE_LLVM 0
43bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák#endif
44bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák
453b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšákstruct r600_multi_fence {
463b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_reference reference;
473b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *gfx;
483b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *sdma;
493b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák};
503b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
51f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák/*
52f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák * pipe_context
53f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák */
54f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
55db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšákvoid r600_draw_rectangle(struct blitter_context *blitter,
56db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák			 int x1, int y1, int x2, int y2, float depth,
57db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák			 enum blitter_attrib_type type,
58db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák			 const union pipe_color_union *attrib)
59db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák{
60db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	struct r600_common_context *rctx =
61db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		(struct r600_common_context*)util_blitter_get_pipe(blitter);
62db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	struct pipe_viewport_state viewport;
63db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	struct pipe_resource *buf = NULL;
64db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	unsigned offset = 0;
65db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	float *vb;
66db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
67db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	if (type == UTIL_BLITTER_ATTRIB_TEXCOORD) {
68db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		util_blitter_draw_rectangle(blitter, x1, y1, x2, y2, depth, type, attrib);
69db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		return;
70db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	}
71db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
72db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* Some operations (like color resolve on r6xx) don't work
73db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * with the conventional primitive types.
74db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * One that works is PT_RECTLIST, which we use here. */
75db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
76db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* setup viewport */
77db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.scale[0] = 1.0f;
78db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.scale[1] = 1.0f;
79db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.scale[2] = 1.0f;
80db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.translate[0] = 0.0f;
81db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.translate[1] = 0.0f;
82db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.translate[2] = 0.0f;
83db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	rctx->b.set_viewport_states(&rctx->b, 0, 1, &viewport);
84db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
85db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* Upload vertices. The hw rectangle has only 3 vertices,
86db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * I guess the 4th one is derived from the first 3.
87db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * The vertex specification should match u_blitter's vertex element state. */
88020009f7ccdffa84c6e1649c4e915954f5fd7cc0Marek Olšák	u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, 256, &offset, &buf, (void**)&vb);
89f95e695059c428a21a1e1a27d5cd5ccce2a97b0eMarek Olšák	if (!buf)
90f95e695059c428a21a1e1a27d5cd5ccce2a97b0eMarek Olšák		return;
91f95e695059c428a21a1e1a27d5cd5ccce2a97b0eMarek Olšák
92db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[0] = x1;
93db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[1] = y1;
94db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[2] = depth;
95db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[3] = 1;
96db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
97db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[8] = x1;
98db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[9] = y2;
99db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[10] = depth;
100db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[11] = 1;
101db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
102db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[16] = x2;
103db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[17] = y1;
104db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[18] = depth;
105db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[19] = 1;
106db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
107db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	if (attrib) {
108db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		memcpy(vb+4, attrib->f, sizeof(float)*4);
109db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		memcpy(vb+12, attrib->f, sizeof(float)*4);
110db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		memcpy(vb+20, attrib->f, sizeof(float)*4);
111db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	}
112db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
113db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* draw */
114db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	util_draw_vertex_buffer(&rctx->b, NULL, buf, blitter->vb_slot, offset,
115db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák				R600_PRIM_RECTANGLE_LIST, 3, 2);
116db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	pipe_resource_reference(&buf, NULL);
117db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák}
118db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
119acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheidervoid r600_need_dma_space(struct r600_common_context *ctx, unsigned num_dw)
120acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider{
12181d412e02ce7db644774202b175f1f24b1f262c7Marek Olšák	/* Flush the GFX IB if it's not empty. */
1226cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	if (ctx->gfx.cs->cdw > ctx->initial_gfx_cs_size)
1236cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		ctx->gfx.flush(ctx, RADEON_FLUSH_ASYNC, NULL);
12481d412e02ce7db644774202b175f1f24b1f262c7Marek Olšák
125acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider	/* Flush if there's not enough space. */
1266cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	if ((num_dw + ctx->dma.cs->cdw) > ctx->dma.cs->max_dw) {
1276cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		ctx->dma.flush(ctx, RADEON_FLUSH_ASYNC, NULL);
1286cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		assert((num_dw + ctx->dma.cs->cdw) <= ctx->dma.cs->max_dw);
129acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider	}
130acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider}
131acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider
1326381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšákstatic void r600_memory_barrier(struct pipe_context *ctx, unsigned flags)
1336381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšák{
1346381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšák}
1356381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšák
13611459436d9314681087463f2c006c58b6fcff396Marek Olšákvoid r600_preflush_suspend_features(struct r600_common_context *ctx)
13711459436d9314681087463f2c006c58b6fcff396Marek Olšák{
13811459436d9314681087463f2c006c58b6fcff396Marek Olšák	/* suspend queries */
1399e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle	if (ctx->num_cs_dw_nontimer_queries_suspend) {
1409e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle		/* Since non-timer queries are suspended during blits,
1419e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle		 * we have to guard against double-suspends. */
14211459436d9314681087463f2c006c58b6fcff396Marek Olšák		r600_suspend_nontimer_queries(ctx);
1439e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle		ctx->nontimer_queries_suspended_by_flush = true;
1449e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle	}
1458a125afa6e88a3eeddba8c7fdc1a75c9b99d5489Nicolai Hähnle	if (!LIST_IS_EMPTY(&ctx->active_timer_queries))
14657245cce52d544c61f03fc966850f0f94e8118d5Marek Olšák		r600_suspend_timer_queries(ctx);
14711459436d9314681087463f2c006c58b6fcff396Marek Olšák
14811459436d9314681087463f2c006c58b6fcff396Marek Olšák	ctx->streamout.suspended = false;
14911459436d9314681087463f2c006c58b6fcff396Marek Olšák	if (ctx->streamout.begin_emitted) {
15011459436d9314681087463f2c006c58b6fcff396Marek Olšák		r600_emit_streamout_end(ctx);
15111459436d9314681087463f2c006c58b6fcff396Marek Olšák		ctx->streamout.suspended = true;
15211459436d9314681087463f2c006c58b6fcff396Marek Olšák	}
15311459436d9314681087463f2c006c58b6fcff396Marek Olšák}
15411459436d9314681087463f2c006c58b6fcff396Marek Olšák
15511459436d9314681087463f2c006c58b6fcff396Marek Olšákvoid r600_postflush_resume_features(struct r600_common_context *ctx)
15611459436d9314681087463f2c006c58b6fcff396Marek Olšák{
15711459436d9314681087463f2c006c58b6fcff396Marek Olšák	if (ctx->streamout.suspended) {
15811459436d9314681087463f2c006c58b6fcff396Marek Olšák		ctx->streamout.append_bitmask = ctx->streamout.enabled_mask;
15911459436d9314681087463f2c006c58b6fcff396Marek Olšák		r600_streamout_buffers_dirty(ctx);
16011459436d9314681087463f2c006c58b6fcff396Marek Olšák	}
16111459436d9314681087463f2c006c58b6fcff396Marek Olšák
16211459436d9314681087463f2c006c58b6fcff396Marek Olšák	/* resume queries */
1638a125afa6e88a3eeddba8c7fdc1a75c9b99d5489Nicolai Hähnle	if (!LIST_IS_EMPTY(&ctx->active_timer_queries))
16457245cce52d544c61f03fc966850f0f94e8118d5Marek Olšák		r600_resume_timer_queries(ctx);
1659e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle	if (ctx->nontimer_queries_suspended_by_flush) {
1669e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle		ctx->nontimer_queries_suspended_by_flush = false;
1678a125afa6e88a3eeddba8c7fdc1a75c9b99d5489Nicolai Hähnle		r600_resume_nontimer_queries(ctx);
1689e5e702cfb380af461062c96d974027da8d5f17aNicolai Hähnle	}
16911459436d9314681087463f2c006c58b6fcff396Marek Olšák}
17011459436d9314681087463f2c006c58b6fcff396Marek Olšák
171adfadeadd8316e95626fec4771393d32a70af649Marek Olšákstatic void r600_flush_from_st(struct pipe_context *ctx,
172adfadeadd8316e95626fec4771393d32a70af649Marek Olšák			       struct pipe_fence_handle **fence,
173adfadeadd8316e95626fec4771393d32a70af649Marek Olšák			       unsigned flags)
174adfadeadd8316e95626fec4771393d32a70af649Marek Olšák{
1753b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_screen *screen = ctx->screen;
176adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
177adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	unsigned rflags = 0;
1783b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *gfx_fence = NULL;
1793b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *sdma_fence = NULL;
180adfadeadd8316e95626fec4771393d32a70af649Marek Olšák
181adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	if (flags & PIPE_FLUSH_END_OF_FRAME)
182adfadeadd8316e95626fec4771393d32a70af649Marek Olšák		rflags |= RADEON_FLUSH_END_OF_FRAME;
183adfadeadd8316e95626fec4771393d32a70af649Marek Olšák
1846cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	if (rctx->dma.cs) {
1856cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->dma.flush(rctx, rflags, fence ? &sdma_fence : NULL);
1863b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	}
1876cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	rctx->gfx.flush(rctx, rflags, fence ? &gfx_fence : NULL);
1883b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
1893b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	/* Both engines can signal out of order, so we need to keep both fences. */
1903b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	if (gfx_fence || sdma_fence) {
1913b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		struct r600_multi_fence *multi_fence =
1923b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			CALLOC_STRUCT(r600_multi_fence);
1933b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		if (!multi_fence)
1943b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			return;
1953b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
1963b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		multi_fence->reference.count = 1;
1973b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		multi_fence->gfx = gfx_fence;
1983b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		multi_fence->sdma = sdma_fence;
1993b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
2003b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		screen->fence_reference(screen, fence, NULL);
2013b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		*fence = (struct pipe_fence_handle*)multi_fence;
202adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	}
203adfadeadd8316e95626fec4771393d32a70af649Marek Olšák}
204adfadeadd8316e95626fec4771393d32a70af649Marek Olšák
20570cf6639c331342619e65c46db925d115bf51920Marek Olšákstatic void r600_flush_dma_ring(void *ctx, unsigned flags,
20670cf6639c331342619e65c46db925d115bf51920Marek Olšák				struct pipe_fence_handle **fence)
207087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider{
208087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
2096cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	struct radeon_winsys_cs *cs = rctx->dma.cs;
210087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider
2118569f9a87ec8d1bea3946476d5cc0be2a58ea149Marek Olšák	if (cs->cdw)
2128569f9a87ec8d1bea3946476d5cc0be2a58ea149Marek Olšák		rctx->ws->cs_flush(cs, flags, &rctx->last_sdma_fence, 0);
2137f9122c9680a882fee5a9d5a8e09c3e3b7466937Marek Olšák	if (fence)
2147f9122c9680a882fee5a9d5a8e09c3e3b7466937Marek Olšák		rctx->ws->fence_reference(fence, rctx->last_sdma_fence);
215087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider}
216087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider
217914365c0eb039f66370cff166428c703e02ad510Marek Olšákstatic enum pipe_reset_status r600_get_reset_status(struct pipe_context *ctx)
218914365c0eb039f66370cff166428c703e02ad510Marek Olšák{
219914365c0eb039f66370cff166428c703e02ad510Marek Olšák	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
220914365c0eb039f66370cff166428c703e02ad510Marek Olšák	unsigned latest = rctx->ws->query_value(rctx->ws,
221914365c0eb039f66370cff166428c703e02ad510Marek Olšák						RADEON_GPU_RESET_COUNTER);
222914365c0eb039f66370cff166428c703e02ad510Marek Olšák
223914365c0eb039f66370cff166428c703e02ad510Marek Olšák	if (rctx->gpu_reset_counter == latest)
224914365c0eb039f66370cff166428c703e02ad510Marek Olšák		return PIPE_NO_RESET;
225914365c0eb039f66370cff166428c703e02ad510Marek Olšák
226914365c0eb039f66370cff166428c703e02ad510Marek Olšák	rctx->gpu_reset_counter = latest;
227914365c0eb039f66370cff166428c703e02ad510Marek Olšák	return PIPE_UNKNOWN_CONTEXT_RESET;
228914365c0eb039f66370cff166428c703e02ad510Marek Olšák}
229914365c0eb039f66370cff166428c703e02ad510Marek Olšák
230b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnlestatic void r600_set_debug_callback(struct pipe_context *ctx,
231b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle				    const struct pipe_debug_callback *cb)
232b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle{
233b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
234b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle
235b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	if (cb)
236b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle		rctx->debug = *cb;
237b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	else
238b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle		memset(&rctx->debug, 0, sizeof(rctx->debug));
239b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle}
240b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle
241f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšákbool r600_common_context_init(struct r600_common_context *rctx,
242f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák			      struct r600_common_screen *rscreen)
243f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák{
244f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	util_slab_create(&rctx->pool_transfers,
245f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák			 sizeof(struct r600_transfer), 64,
246f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák			 UTIL_SLAB_SINGLETHREADED);
247f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
248f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->screen = rscreen;
249f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->ws = rscreen->ws;
250f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->family = rscreen->family;
251f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->chip_class = rscreen->chip_class;
25271ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák
253bfc14796b077444011c81f544ceec5d8592c5c77Marek Olšák	if (rscreen->chip_class >= CIK)
254bfc14796b077444011c81f544ceec5d8592c5c77Marek Olšák		rctx->max_db = MAX2(8, rscreen->info.r600_num_backends);
25571ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák	else if (rscreen->chip_class >= EVERGREEN)
25671ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák		rctx->max_db = 8;
25771ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák	else
25871ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák		rctx->max_db = 4;
259f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
260f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->b.transfer_map = u_transfer_map_vtbl;
261b409524fef1b02c717b4cc1fef70d5710781f824Marek Olšák	rctx->b.transfer_flush_region = u_transfer_flush_region_vtbl;
262f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->b.transfer_unmap = u_transfer_unmap_vtbl;
263f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->b.transfer_inline_write = u_default_transfer_inline_write;
2646381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšák        rctx->b.memory_barrier = r600_memory_barrier;
265adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	rctx->b.flush = r600_flush_from_st;
266b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	rctx->b.set_debug_callback = r600_set_debug_callback;
267f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
268914365c0eb039f66370cff166428c703e02ad510Marek Olšák	if (rscreen->info.drm_major == 2 && rscreen->info.drm_minor >= 43) {
269914365c0eb039f66370cff166428c703e02ad510Marek Olšák		rctx->b.get_device_reset_status = r600_get_reset_status;
270914365c0eb039f66370cff166428c703e02ad510Marek Olšák		rctx->gpu_reset_counter =
271914365c0eb039f66370cff166428c703e02ad510Marek Olšák			rctx->ws->query_value(rctx->ws,
272914365c0eb039f66370cff166428c703e02ad510Marek Olšák					      RADEON_GPU_RESET_COUNTER);
273914365c0eb039f66370cff166428c703e02ad510Marek Olšák	}
274914365c0eb039f66370cff166428c703e02ad510Marek Olšák
27579f28cdb983b7faf9d3008fae541a30e34ccce5aMarek Olšák	LIST_INITHEAD(&rctx->texture_buffers);
27679f28cdb983b7faf9d3008fae541a30e34ccce5aMarek Olšák
2779855477e903e00f7457adb15594048416444b992Marek Olšák	r600_init_context_texture_functions(rctx);
278f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	r600_streamout_init(rctx);
279f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	r600_query_init(rctx);
28099d9d7c0d69c076d84334892ee12f921fe243319Marek Olšák	cayman_init_msaa(&rctx->b);
281f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
282f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->allocator_so_filled_size = u_suballocator_create(&rctx->b, 4096, 4,
283c32114460dbb7f33885c181a0d7dee07b15b8751Marek Olšák							       0, PIPE_USAGE_DEFAULT, TRUE);
284f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (!rctx->allocator_so_filled_size)
285f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		return false;
286f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
28737d0aea772a39f9ae7fe3d791e23c1be03ccf9deMarek Olšák	rctx->uploader = u_upload_create(&rctx->b, 1024 * 1024,
288f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák					PIPE_BIND_INDEX_BUFFER |
289ecb2da1559bcb9a9eec7ac224c8ff47b026c95ffMarek Olšák					PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STREAM);
290f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (!rctx->uploader)
291f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		return false;
292f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
29342d9f6323a523d786fc3797587fdf63048beccebMarek Olšák	rctx->ctx = rctx->ws->ctx_create(rctx->ws);
29442d9f6323a523d786fc3797587fdf63048beccebMarek Olšák	if (!rctx->ctx)
29542d9f6323a523d786fc3797587fdf63048beccebMarek Olšák		return false;
29642d9f6323a523d786fc3797587fdf63048beccebMarek Olšák
297087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider	if (rscreen->info.r600_has_dma && !(rscreen->debug_flags & DBG_NO_ASYNC_DMA)) {
2986cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->dma.cs = rctx->ws->cs_create(rctx->ctx, RING_DMA,
2996cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák						   r600_flush_dma_ring,
3006cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák						   rctx, NULL);
3016cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->dma.flush = r600_flush_dma_ring;
302087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider	}
303087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider
304f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	return true;
305f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák}
306f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
307f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšákvoid r600_common_context_cleanup(struct r600_common_context *rctx)
308f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák{
3096cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	if (rctx->gfx.cs)
3106cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->ws->cs_destroy(rctx->gfx.cs);
3116cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	if (rctx->dma.cs)
3126cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->ws->cs_destroy(rctx->dma.cs);
31342d9f6323a523d786fc3797587fdf63048beccebMarek Olšák	if (rctx->ctx)
31442d9f6323a523d786fc3797587fdf63048beccebMarek Olšák		rctx->ws->ctx_destroy(rctx->ctx);
315f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
316f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (rctx->uploader) {
317f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		u_upload_destroy(rctx->uploader);
318f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	}
319f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
320f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	util_slab_destroy(&rctx->pool_transfers);
321f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
322f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (rctx->allocator_so_filled_size) {
323f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		u_suballocator_destroy(rctx->allocator_so_filled_size);
324f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	}
3257f9122c9680a882fee5a9d5a8e09c3e3b7466937Marek Olšák	rctx->ws->fence_reference(&rctx->last_sdma_fence, NULL);
326f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák}
327f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
328f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšákvoid r600_context_add_resource_size(struct pipe_context *ctx, struct pipe_resource *r)
329f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák{
330f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
331f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	struct r600_resource *rr = (struct r600_resource *)r;
332f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
33313eb5f596bc8ece3d1805b388aa53917e6158d7bEdward O'Callaghan	if (!r) {
334f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		return;
335f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	}
336f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
337f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	/*
338f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	 * The idea is to compute a gross estimate of memory requirement of
339f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	 * each draw call. After each draw call, memory will be precisely
340f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	 * accounted. So the uncertainty is only on the current draw call.
341f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	 * In practice this gave very good estimate (+/- 10% of the target
342f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	 * memory limit).
343f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	 */
344f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (rr->domains & RADEON_DOMAIN_GTT) {
345f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		rctx->gtt += rr->buf->size;
346f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	}
347f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (rr->domains & RADEON_DOMAIN_VRAM) {
348f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		rctx->vram += rr->buf->size;
349f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	}
350f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák}
351f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
352f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák/*
353f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák * pipe_screen
354f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák */
355f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
356ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšákstatic const struct debug_named_value common_debug_options[] = {
357ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	/* logging */
3584e9aa6711f933f9c85c9fd09831060541bc2003aMarek Olšák	{ "tex", DBG_TEX, "Print texture info" },
359ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "compute", DBG_COMPUTE, "Print compute info" },
360ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "vm", DBG_VM, "Print virtual addresses when creating resources" },
361ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "trace_cs", DBG_TRACE_CS, "Trace cs and write rlockup_<csid>.c file with faulty cs" },
362d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák	{ "info", DBG_INFO, "Print driver information" },
363ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák
364ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	/* shaders */
365ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "fs", DBG_FS, "Print fetch shaders" },
366ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "vs", DBG_VS, "Print vertex shaders" },
367ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "gs", DBG_GS, "Print geometry shaders" },
368ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "ps", DBG_PS, "Print pixel shaders" },
369ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "cs", DBG_CS, "Print compute shaders" },
370c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák	{ "tcs", DBG_TCS, "Print tessellation control shaders" },
371c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák	{ "tes", DBG_TES, "Print tessellation evaluation shaders" },
372ac19a896d3de13b7d064d01c575f46f4191ef37cMarek Olšák	{ "noir", DBG_NO_IR, "Don't print the LLVM IR"},
3732dcbd427da74c8f2b6f46e789924a7ced67be260Marek Olšák	{ "notgsi", DBG_NO_TGSI, "Don't print the TGSI"},
3743063c5e3d3fefdc5eed7600882bd08f56bf86db8Marek Olšák	{ "noasm", DBG_NO_ASM, "Don't print disassembled shaders"},
375ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák
376ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	/* features */
377ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	{ "nodma", DBG_NO_ASYNC_DMA, "Disable asynchronous DMA" },
37814bdcc6ff98664552216acfdb7e35d0b128003efAndreas Boll	{ "nohyperz", DBG_NO_HYPERZ, "Disable Hyper-Z" },
379e1374d86fecb58edc9cf9b456b05d74a0034eafdMarek Olšák	/* GL uses the word INVALIDATE, gallium uses the word DISCARD */
380e1374d86fecb58edc9cf9b456b05d74a0034eafdMarek Olšák	{ "noinvalrange", DBG_NO_DISCARD_RANGE, "Disable handling of INVALIDATE_RANGE map flags" },
381ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	{ "no2d", DBG_NO_2D_TILING, "Disable 2D tiling" },
382ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	{ "notiling", DBG_NO_TILING, "Disable tiling" },
3830e229b8c5aa5eb758cbc9e1176001e0f4d985a6aMarek Olšák	{ "switch_on_eop", DBG_SWITCH_ON_EOP, "Program WD/IA to switch on end-of-packet." },
384d13d2fd16132f351ec7c8184f165faeac3b31bb4Marek Olšák	{ "forcedma", DBG_FORCE_DMA, "Use asynchronous DMA for all operations when possible." },
385b79c620663dc4eab1ad342a7961fa7aa16cff562Marek Olšák	{ "precompile", DBG_PRECOMPILE, "Compile one shader variant at shader creation." },
3867e5d56394bd53607d0158b49f36ac1428acb7954Marek Olšák	{ "nowc", DBG_NO_WC, "Disable GTT write combining" },
3879bd7928a35c27d3d0898db83bc8db823a6dbee5eMarek Olšák	{ "check_vm", DBG_CHECK_VM, "Check VM faults and dump debug info." },
3883aebc596b339b1b787ed0dfc27793263d48b2819Marek Olšák	{ "nodcc", DBG_NO_DCC, "Disable DCC." },
3893aebc596b339b1b787ed0dfc27793263d48b2819Marek Olšák	{ "nodccclear", DBG_NO_DCC_CLEAR, "Disable DCC fast clear." },
390de887ba90ce077a0243269aa0c72a1ab0d2d3ff4Marek Olšák	{ "norbplus", DBG_NO_RB_PLUS, "Disable RB+ on Stoney." },
391e1374d86fecb58edc9cf9b456b05d74a0034eafdMarek Olšák
392ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	DEBUG_NAMED_VALUE_END /* must be last */
393ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák};
394ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák
3954df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšákstatic const char* r600_get_vendor(struct pipe_screen* pscreen)
3964df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák{
3974df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	return "X.Org";
3984df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák}
3994df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák
40076039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilottastatic const char* r600_get_device_vendor(struct pipe_screen* pscreen)
40176039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta{
40276039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta	return "AMD";
40376039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta}
40476039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta
405a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšákstatic const char* r600_get_chip_name(struct r600_common_screen *rscreen)
4064df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák{
407a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	switch (rscreen->info.family) {
4084df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_R600: return "AMD R600";
4094df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV610: return "AMD RV610";
4104df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV630: return "AMD RV630";
4114df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV670: return "AMD RV670";
4124df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV620: return "AMD RV620";
4134df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV635: return "AMD RV635";
4144df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RS780: return "AMD RS780";
4154df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RS880: return "AMD RS880";
4164df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV770: return "AMD RV770";
4174df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV730: return "AMD RV730";
4184df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV710: return "AMD RV710";
4194df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV740: return "AMD RV740";
4204df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CEDAR: return "AMD CEDAR";
4214df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_REDWOOD: return "AMD REDWOOD";
4224df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_JUNIPER: return "AMD JUNIPER";
4234df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CYPRESS: return "AMD CYPRESS";
4244df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_HEMLOCK: return "AMD HEMLOCK";
4254df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_PALM: return "AMD PALM";
4264df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_SUMO: return "AMD SUMO";
4274df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_SUMO2: return "AMD SUMO2";
4284df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_BARTS: return "AMD BARTS";
4294df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_TURKS: return "AMD TURKS";
4304df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CAICOS: return "AMD CAICOS";
4314df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CAYMAN: return "AMD CAYMAN";
4324df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_ARUBA: return "AMD ARUBA";
4334df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_TAHITI: return "AMD TAHITI";
4344df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_PITCAIRN: return "AMD PITCAIRN";
4354df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_VERDE: return "AMD CAPE VERDE";
4364df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_OLAND: return "AMD OLAND";
4374df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_HAINAN: return "AMD HAINAN";
4384df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_BONAIRE: return "AMD BONAIRE";
4394df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_KAVERI: return "AMD KAVERI";
4404df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_KABINI: return "AMD KABINI";
4414df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_HAWAII: return "AMD HAWAII";
442aad669b1e90491f7c3951016456e8a2660d91a85Samuel Li	case CHIP_MULLINS: return "AMD MULLINS";
4432d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_TONGA: return "AMD TONGA";
4442d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_ICELAND: return "AMD ICELAND";
4452d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_CARRIZO: return "AMD CARRIZO";
446767ad50a10d01274b1d1a877add12b5552ba6984Alex Deucher	case CHIP_FIJI: return "AMD FIJI";
447bf0d0ce0d57dce5df8195942d2eda6389d341feaSamuel Li	case CHIP_STONEY: return "AMD STONEY";
4484df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	default: return "AMD unknown";
4494df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	}
4504df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák}
4514df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák
452a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšákstatic const char* r600_get_name(struct pipe_screen* pscreen)
453a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák{
454a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen*)pscreen;
455a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
456a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	return rscreen->renderer_string;
457a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák}
458a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
459d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšákstatic float r600_get_paramf(struct pipe_screen* pscreen,
460d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák			     enum pipe_capf param)
461d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák{
462d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen *)pscreen;
463d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
464d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	switch (param) {
465d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_LINE_WIDTH:
466d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_LINE_WIDTH_AA:
467d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_POINT_WIDTH:
468d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_POINT_WIDTH_AA:
469d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		if (rscreen->family >= CHIP_CEDAR)
470d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák			return 16384.0f;
471d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		else
472d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák			return 8192.0f;
473d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
474d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 16.0f;
475d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
476d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 16.0f;
477d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_LEFT:
478d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_TOP:
479d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_RIGHT:
480d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_BOTTOM:
481d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 0.0f;
482d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	}
483d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	return 0.0f;
484d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák}
485d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
486d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšákstatic int r600_get_video_param(struct pipe_screen *screen,
487d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák				enum pipe_video_profile profile,
488d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák				enum pipe_video_entrypoint entrypoint,
489d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák				enum pipe_video_cap param)
490d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák{
491d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	switch (param) {
492d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_SUPPORTED:
493d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return vl_profile_supported(screen, profile, entrypoint);
494d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_NPOT_TEXTURES:
495d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 1;
496d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_MAX_WIDTH:
497d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_MAX_HEIGHT:
498d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return vl_video_buffer_max_size(screen);
499d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_PREFERED_FORMAT:
500d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return PIPE_FORMAT_NV12;
501d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
502d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return false;
503d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
504d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return false;
505d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
506d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return true;
507d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_MAX_LEVEL:
508d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return vl_level_supported(screen, profile);
509d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	default:
510d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 0;
511d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	}
512d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák}
513d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
51465dc588bfd3b8145131340ffe77f216be58378acMarek Olšákconst char *r600_get_llvm_processor_name(enum radeon_family family)
51565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák{
51665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	switch (family) {
51765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_R600:
51865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV630:
51965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV635:
52065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV670:
52165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "r600";
52265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV610:
52365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV620:
52465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RS780:
52565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RS880:
52665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rs880";
52765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV710:
52865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rv710";
52965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV730:
53065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rv730";
53165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV740:
53265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV770:
53365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rv770";
53465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_PALM:
53565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CEDAR:
53665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "cedar";
53765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_SUMO:
53865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_SUMO2:
53965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "sumo";
54065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_REDWOOD:
54165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "redwood";
54265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_JUNIPER:
54365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "juniper";
54465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_HEMLOCK:
54565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CYPRESS:
54665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "cypress";
54765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_BARTS:
54865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "barts";
54965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_TURKS:
55065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "turks";
55165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CAICOS:
55265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "caicos";
55365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CAYMAN:
55465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák        case CHIP_ARUBA:
55565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "cayman";
55665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
55765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_TAHITI: return "tahiti";
55865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_PITCAIRN: return "pitcairn";
55965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_VERDE: return "verde";
56065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_OLAND: return "oland";
56165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_HAINAN: return "hainan";
56265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_BONAIRE: return "bonaire";
56365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_KABINI: return "kabini";
56465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_KAVERI: return "kaveri";
56565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_HAWAII: return "hawaii";
566aad669b1e90491f7c3951016456e8a2660d91a85Samuel Li	case CHIP_MULLINS:
567aad669b1e90491f7c3951016456e8a2660d91a85Samuel Li		return "mullins";
5682d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_TONGA: return "tonga";
5692d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_ICELAND: return "iceland";
5702d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_CARRIZO: return "carrizo";
571bf0d0ce0d57dce5df8195942d2eda6389d341feaSamuel Li#if HAVE_LLVM <= 0x0307
572dd27825c8cf0e7b55ebaa139e299f275943d22f6Marek Olšák	case CHIP_FIJI: return "tonga";
573bf0d0ce0d57dce5df8195942d2eda6389d341feaSamuel Li	case CHIP_STONEY: return "carrizo";
574bf0d0ce0d57dce5df8195942d2eda6389d341feaSamuel Li#else
575dd27825c8cf0e7b55ebaa139e299f275943d22f6Marek Olšák	case CHIP_FIJI: return "fiji";
576bf0d0ce0d57dce5df8195942d2eda6389d341feaSamuel Li	case CHIP_STONEY: return "stoney";
577bf0d0ce0d57dce5df8195942d2eda6389d341feaSamuel Li#endif
57865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	default: return "";
57965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	}
58065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák}
58165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
58265dc588bfd3b8145131340ffe77f216be58378acMarek Olšákstatic int r600_get_compute_param(struct pipe_screen *screen,
58365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák        enum pipe_compute_cap param,
58465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák        void *ret)
58565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák{
58665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen *)screen;
58765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
58865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	//TODO: select these params by asic
58965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	switch (param) {
59065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_IR_TARGET: {
5918109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		const char *gpu;
592a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard		const char *triple;
593a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard		if (rscreen->family <= CHIP_ARUBA || HAVE_LLVM < 0x0306) {
594a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard			triple = "r600--";
595a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard		} else {
596a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard			triple = "amdgcn--";
597a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard		}
5988109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		switch(rscreen->family) {
5998109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		/* Clang < 3.6 is missing Hainan in its list of
6008109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		 * GPUs, so we need to use the name of a similar GPU.
6018109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		 */
6028109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard#if HAVE_LLVM < 0x0306
6038109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		case CHIP_HAINAN:
6048109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard			gpu = "oland";
6058109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard			break;
6068109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard#endif
6078109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		default:
6088109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard			gpu = r600_get_llvm_processor_name(rscreen->family);
6098109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard			break;
6108109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		}
61165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
612a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard			sprintf(ret, "%s-%s", gpu, triple);
61365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
614ee31c8d7067ec5a563cdce5a12d8e077db0a7f67Michel Dänzer		/* +2 for dash and terminating NIL byte */
615ee31c8d7067ec5a563cdce5a12d8e077db0a7f67Michel Dänzer		return (strlen(triple) + strlen(gpu) + 2) * sizeof(char);
61665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	}
61765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_GRID_DIMENSION:
61865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
61965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *grid_dimension = ret;
62065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			grid_dimension[0] = 3;
62165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
62265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return 1 * sizeof(uint64_t);
62365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
62465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:
62565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
62665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *grid_size = ret;
62765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			grid_size[0] = 65535;
62865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			grid_size[1] = 65535;
62965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			grid_size[2] = 1;
63065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
63165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return 3 * sizeof(uint64_t) ;
63265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
63365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:
63465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
63565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *block_size = ret;
63665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			block_size[0] = 256;
63765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			block_size[1] = 256;
63865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			block_size[2] = 256;
63965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
64065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return 3 * sizeof(uint64_t);
64165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
64265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:
64365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
64465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_threads_per_block = ret;
64565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			*max_threads_per_block = 256;
64665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
64765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
64865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
64965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:
65065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
65165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_global_size = ret;
65277ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			uint64_t max_mem_alloc_size;
65377ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard
65477ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			r600_get_compute_param(screen,
65577ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard				PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
65677ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard				&max_mem_alloc_size);
65777ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard
65877ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			/* In OpenCL, the MAX_MEM_ALLOC_SIZE must be at least
65977ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * 1/4 of the MAX_GLOBAL_SIZE.  Since the
66077ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * MAX_MEM_ALLOC_SIZE is fixed for older kernels,
66177ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * make sure we never report more than
66277ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * 4 * MAX_MEM_ALLOC_SIZE.
66377ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 */
66477ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			*max_global_size = MIN2(4 * max_mem_alloc_size,
66577ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard				rscreen->info.gart_size +
66677ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard				rscreen->info.vram_size);
66765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
66865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
66965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
67065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:
67165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
67265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_local_size = ret;
67365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			/* Value reported by the closed source driver. */
67465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			*max_local_size = 32768;
67565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
67665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
67765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
67865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE:
67965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
68065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_input_size = ret;
68165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			/* Value reported by the closed source driver. */
68265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			*max_input_size = 1024;
68365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
68465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
68565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
68665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE:
68765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
68865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_mem_alloc_size = ret;
68977ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard
69077ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			/* XXX: The limit in older kernels is 256 MB.  We
69177ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * should add a query here for newer kernels.
69265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			 */
69377ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			*max_mem_alloc_size = 256 * 1024 * 1024;
69465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
69565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
69665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
6970a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard	case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:
6980a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard		if (ret) {
6990a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard			uint32_t *max_clock_frequency = ret;
7000a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard			*max_clock_frequency = rscreen->info.max_sclk;
7010a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard		}
7020a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard		return sizeof(uint32_t);
7030a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard
70403aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez	case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:
70503aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez		if (ret) {
70603aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez			uint32_t *max_compute_units = ret;
7070e1c085f17fdd774ff6b060dd03422e74ea3e2ccTom Stellard			*max_compute_units = rscreen->info.max_compute_units;
70803aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez		}
70903aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez		return sizeof(uint32_t);
7101607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard
7111607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard	case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:
7121607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard		if (ret) {
7131607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard			uint32_t *images_supported = ret;
7141607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard			*images_supported = 0;
7151607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard		}
7161607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard		return sizeof(uint32_t);
717b77eaafcdc1b9f050d44d46608e542a9e593da3eMarek Olšák	case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:
718b77eaafcdc1b9f050d44d46608e542a9e593da3eMarek Olšák		break; /* unused */
719249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy	case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
720249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy		if (ret) {
721249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy			uint32_t *subgroup_size = ret;
722249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy			*subgroup_size = r600_wavefront_size(rscreen->family);
723249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy		}
724249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy		return sizeof(uint32_t);
72565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	}
726d6fd8a97711eb065603a8d667ff5dbe68a246439Michel Dänzer
727d6fd8a97711eb065603a8d667ff5dbe68a246439Michel Dänzer        fprintf(stderr, "unknown PIPE_COMPUTE_CAP %d\n", param);
728d6fd8a97711eb065603a8d667ff5dbe68a246439Michel Dänzer        return 0;
72965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák}
73065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
731ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšákstatic uint64_t r600_get_timestamp(struct pipe_screen *screen)
732ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák{
733ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
734ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák
735ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák	return 1000000 * rscreen->ws->query_value(rscreen->ws, RADEON_TIMESTAMP) /
736ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák			rscreen->info.r600_clock_crystal_freq;
737ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák}
738ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák
7399807556e863ca4f49905598a18912852e96fae76Marek Olšákstatic void r600_fence_reference(struct pipe_screen *screen,
7403b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák				 struct pipe_fence_handle **dst,
7413b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák				 struct pipe_fence_handle *src)
7429807556e863ca4f49905598a18912852e96fae76Marek Olšák{
7433b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct radeon_winsys *ws = ((struct r600_common_screen*)screen)->ws;
7443b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct r600_multi_fence **rdst = (struct r600_multi_fence **)dst;
7453b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct r600_multi_fence *rsrc = (struct r600_multi_fence *)src;
7463b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
7473b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	if (pipe_reference(&(*rdst)->reference, &rsrc->reference)) {
7483b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		ws->fence_reference(&(*rdst)->gfx, NULL);
7493b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		ws->fence_reference(&(*rdst)->sdma, NULL);
7503b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		FREE(*rdst);
7513b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	}
7523b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák        *rdst = rsrc;
7539807556e863ca4f49905598a18912852e96fae76Marek Olšák}
7549807556e863ca4f49905598a18912852e96fae76Marek Olšák
7559807556e863ca4f49905598a18912852e96fae76Marek Olšákstatic boolean r600_fence_finish(struct pipe_screen *screen,
7569807556e863ca4f49905598a18912852e96fae76Marek Olšák				 struct pipe_fence_handle *fence,
7579807556e863ca4f49905598a18912852e96fae76Marek Olšák				 uint64_t timeout)
7589807556e863ca4f49905598a18912852e96fae76Marek Olšák{
7599807556e863ca4f49905598a18912852e96fae76Marek Olšák	struct radeon_winsys *rws = ((struct r600_common_screen*)screen)->ws;
7603b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct r600_multi_fence *rfence = (struct r600_multi_fence *)fence;
7613b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	int64_t abs_timeout = os_time_get_absolute_timeout(timeout);
7623b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
7633b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	if (rfence->sdma) {
7643b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		if (!rws->fence_wait(rws, rfence->sdma, timeout))
7653b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			return false;
7663b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
7673b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		/* Recompute the timeout after waiting. */
7683b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		if (timeout && timeout != PIPE_TIMEOUT_INFINITE) {
7693b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			int64_t time = os_time_get_nano();
7703b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			timeout = abs_timeout > time ? abs_timeout - time : 0;
7713b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		}
7723b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	}
7733b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
7743b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	if (!rfence->gfx)
7753b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		return true;
7769807556e863ca4f49905598a18912852e96fae76Marek Olšák
7773b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	return rws->fence_wait(rws, rfence->gfx, timeout);
7789807556e863ca4f49905598a18912852e96fae76Marek Olšák}
7799807556e863ca4f49905598a18912852e96fae76Marek Olšák
7801bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšákstatic bool r600_interpret_tiling(struct r600_common_screen *rscreen,
7811bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák				  uint32_t tiling_config)
7821bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák{
7831bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	switch ((tiling_config & 0xe) >> 1) {
7841bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 0:
7851bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 1;
7861bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
7871bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 1:
7881bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 2;
7891bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
7901bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 2:
7911bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 4;
7921bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
7931bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 3:
7941bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 8;
7951bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
7961bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	default:
7971bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return false;
7981bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
7991bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8001bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	switch ((tiling_config & 0x30) >> 4) {
8011bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 0:
8021bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_banks = 4;
8031bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8041bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 1:
8051bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_banks = 8;
8061bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8071bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	default:
8081bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return false;
8091bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8101bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
8111bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	switch ((tiling_config & 0xc0) >> 6) {
8121bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 0:
8131bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.group_bytes = 256;
8141bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8151bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 1:
8161bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.group_bytes = 512;
8171bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8181bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	default:
8191bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return false;
8201bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
8211bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	return true;
8221bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák}
8231bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8241bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšákstatic bool evergreen_interpret_tiling(struct r600_common_screen *rscreen,
8251bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák				       uint32_t tiling_config)
8261bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák{
8271bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	switch (tiling_config & 0xf) {
8281bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 0:
8291bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 1;
8301bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8311bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 1:
8321bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 2;
8331bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8341bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 2:
8351bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 4;
8361bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8371bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 3:
8381bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_channels = 8;
8391bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8401bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	default:
8411bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return false;
8421bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
8431bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8441bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	switch ((tiling_config & 0xf0) >> 4) {
8451bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 0:
8461bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_banks = 4;
8471bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8481bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 1:
8491bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_banks = 8;
8501bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8511bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 2:
8521bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.num_banks = 16;
8531bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8541bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	default:
8551bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return false;
8561bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
8571bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8581bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	switch ((tiling_config & 0xf00) >> 8) {
8591bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 0:
8601bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.group_bytes = 256;
8611bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8621bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	case 1:
8631bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.group_bytes = 512;
8641bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		break;
8651bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	default:
8661bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return false;
8671bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
8681bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	return true;
8691bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák}
8701bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8711bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšákstatic bool r600_init_tiling(struct r600_common_screen *rscreen)
8721bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák{
8731bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	uint32_t tiling_config = rscreen->info.r600_tiling_config;
8741bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8751bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	/* set default group bytes, overridden by tiling info ioctl */
8761bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	if (rscreen->chip_class <= R700) {
8771bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.group_bytes = 256;
8781bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	} else {
8791bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		rscreen->tiling_info.group_bytes = 512;
8801bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
8811bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8821bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	if (!tiling_config)
8831bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return true;
8841bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
8851bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	if (rscreen->chip_class <= R700) {
8861bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return r600_interpret_tiling(rscreen, tiling_config);
8871bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	} else {
8881bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return evergreen_interpret_tiling(rscreen, tiling_config);
8891bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
8901bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák}
8911bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák
892a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšákstruct pipe_resource *r600_resource_create_common(struct pipe_screen *screen,
893a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák						  const struct pipe_resource *templ)
894a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák{
895a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	if (templ->target == PIPE_BUFFER) {
896a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák		return r600_buffer_create(screen, templ, 4096);
897a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	} else {
898a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák		return r600_texture_create(screen, templ);
899a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	}
900a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák}
901a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák
9021bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšákbool r600_common_screen_init(struct r600_common_screen *rscreen,
903d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák			     struct radeon_winsys *ws)
904d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák{
905a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	char llvm_string[32] = {};
906a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
907d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	ws->query_info(ws, &rscreen->info);
908d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
909b88f14702d9c02a34d517f95fe840527961631cdMarek Olšák#if HAVE_LLVM
910b88f14702d9c02a34d517f95fe840527961631cdMarek Olšák	snprintf(llvm_string, sizeof(llvm_string),
911b88f14702d9c02a34d517f95fe840527961631cdMarek Olšák		 ", LLVM %i.%i.%i", (HAVE_LLVM >> 8) & 0xff,
912b88f14702d9c02a34d517f95fe840527961631cdMarek Olšák		 HAVE_LLVM & 0xff, MESA_LLVM_VERSION_PATCH);
913b88f14702d9c02a34d517f95fe840527961631cdMarek Olšák#endif
914a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
915a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	snprintf(rscreen->renderer_string, sizeof(rscreen->renderer_string),
916a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák		 "%s (DRM %i.%i.%i%s)",
917a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák		 r600_get_chip_name(rscreen), rscreen->info.drm_major,
918a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák		 rscreen->info.drm_minor, rscreen->info.drm_patchlevel,
919a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák		 llvm_string);
920a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
9214df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	rscreen->b.get_name = r600_get_name;
9224df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	rscreen->b.get_vendor = r600_get_vendor;
92376039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta	rscreen->b.get_device_vendor = r600_get_device_vendor;
92465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	rscreen->b.get_compute_param = r600_get_compute_param;
925d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	rscreen->b.get_paramf = r600_get_paramf;
926ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák	rscreen->b.get_timestamp = r600_get_timestamp;
9279807556e863ca4f49905598a18912852e96fae76Marek Olšák	rscreen->b.fence_finish = r600_fence_finish;
9289807556e863ca4f49905598a18912852e96fae76Marek Olšák	rscreen->b.fence_reference = r600_fence_reference;
929a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	rscreen->b.resource_destroy = u_resource_destroy_vtbl;
9307713d594e4fbb9afb1ac67417b7871d436590548Marek Olšák	rscreen->b.resource_from_user_memory = r600_buffer_from_user_memory;
931a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák
932d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	if (rscreen->info.has_uvd) {
9337bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König		rscreen->b.get_video_param = rvid_get_video_param;
9347bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König		rscreen->b.is_video_format_supported = rvid_is_format_supported;
935d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	} else {
936d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		rscreen->b.get_video_param = r600_get_video_param;
937d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		rscreen->b.is_video_format_supported = vl_video_buffer_is_format_supported;
938d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	}
939d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
9409855477e903e00f7457adb15594048416444b992Marek Olšák	r600_init_screen_texture_functions(rscreen);
941e117e74baf0e0482fd4c3c2fa412e7168889d286Nicolai Hähnle	r600_init_screen_query_functions(rscreen);
9429807556e863ca4f49905598a18912852e96fae76Marek Olšák
943d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	rscreen->ws = ws;
944d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	rscreen->family = rscreen->info.family;
945d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	rscreen->chip_class = rscreen->info.chip_class;
946ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	rscreen->debug_flags = debug_get_flags_option("R600_DEBUG", common_debug_options, 0);
94768f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
9481bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	if (!r600_init_tiling(rscreen)) {
9491bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák		return false;
9501bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	}
9511bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	util_format_s3tc_init();
95268f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_init(rscreen->aux_context_lock);
9536d05396b0047c74d740c53156eda1a8574403498Marek Olšák	pipe_mutex_init(rscreen->gpu_load_mutex);
954ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák
9558ba70e0a7405005c079eb72f94999245c992aa91Marek Olšák	if (((rscreen->info.drm_major == 2 && rscreen->info.drm_minor >= 28) ||
9568ba70e0a7405005c079eb72f94999245c992aa91Marek Olšák	     rscreen->info.drm_major == 3) &&
9578ba70e0a7405005c079eb72f94999245c992aa91Marek Olšák	    (rscreen->debug_flags & DBG_TRACE_CS)) {
958ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák		rscreen->trace_bo = (struct r600_resource*)pipe_buffer_create(&rscreen->b,
959ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák										PIPE_BIND_CUSTOM,
960ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák										PIPE_USAGE_STAGING,
961ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák										4096);
962ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák		if (rscreen->trace_bo) {
963cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák			rscreen->trace_ptr = rscreen->ws->buffer_map(rscreen->trace_bo->buf, NULL,
964ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák									PIPE_TRANSFER_UNSYNCHRONIZED);
965ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák		}
966ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák	}
967ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák
968d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák	if (rscreen->debug_flags & DBG_INFO) {
969d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("pci_id = 0x%x\n", rscreen->info.pci_id);
970d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("family = %i\n", rscreen->info.family);
971d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("chip_class = %i\n", rscreen->info.chip_class);
972d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("gart_size = %i MB\n", (int)(rscreen->info.gart_size >> 20));
973d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("vram_size = %i MB\n", (int)(rscreen->info.vram_size >> 20));
974d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("max_sclk = %i\n", rscreen->info.max_sclk);
975d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("max_compute_units = %i\n", rscreen->info.max_compute_units);
976d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("max_se = %i\n", rscreen->info.max_se);
977d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("max_sh_per_se = %i\n", rscreen->info.max_sh_per_se);
978d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("drm = %i.%i.%i\n", rscreen->info.drm_major,
979d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		       rscreen->info.drm_minor, rscreen->info.drm_patchlevel);
980d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("has_uvd = %i\n", rscreen->info.has_uvd);
981d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("vce_fw_version = %i\n", rscreen->info.vce_fw_version);
982d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_num_backends = %i\n", rscreen->info.r600_num_backends);
983d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_clock_crystal_freq = %i\n", rscreen->info.r600_clock_crystal_freq);
984d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_tiling_config = 0x%x\n", rscreen->info.r600_tiling_config);
985d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_num_tile_pipes = %i\n", rscreen->info.r600_num_tile_pipes);
986d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_max_pipes = %i\n", rscreen->info.r600_max_pipes);
987d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_virtual_address = %i\n", rscreen->info.r600_virtual_address);
988d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_has_dma = %i\n", rscreen->info.r600_has_dma);
989d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_backend_map = %i\n", rscreen->info.r600_backend_map);
990d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("r600_backend_map_valid = %i\n", rscreen->info.r600_backend_map_valid);
991d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("si_tile_mode_array_valid = %i\n", rscreen->info.si_tile_mode_array_valid);
992d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("cik_macrotile_mode_array_valid = %i\n", rscreen->info.cik_macrotile_mode_array_valid);
993d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák	}
9941bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	return true;
99568f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák}
99668f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
997ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšákvoid r600_destroy_common_screen(struct r600_common_screen *rscreen)
99868f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák{
999ad22006892c5511dac7d0d680633a1b857da49fbNicolai Hähnle	r600_perfcounters_destroy(rscreen);
10006d05396b0047c74d740c53156eda1a8574403498Marek Olšák	r600_gpu_load_kill_thread(rscreen);
10016d05396b0047c74d740c53156eda1a8574403498Marek Olšák
10026d05396b0047c74d740c53156eda1a8574403498Marek Olšák	pipe_mutex_destroy(rscreen->gpu_load_mutex);
100368f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_destroy(rscreen->aux_context_lock);
100468f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	rscreen->aux_context->destroy(rscreen->aux_context);
1005ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák
10065e3974338ed7ea49a41405f8c2e4bcd5fd1f5c80Marek Olšák	if (rscreen->trace_bo)
1007ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák		pipe_resource_reference((struct pipe_resource**)&rscreen->trace_bo, NULL);
1008ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák
1009ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák	rscreen->ws->destroy(rscreen->ws);
1010ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák	FREE(rscreen);
1011d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák}
1012d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
10130cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšákbool r600_can_dump_shader(struct r600_common_screen *rscreen,
10140cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák			  const struct tgsi_token *tokens)
10150cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák{
1016b280516e114776c8d34c2d6fe0174762f3c85c0eTom Stellard	/* Compute shader don't have tgsi_tokens */
1017b280516e114776c8d34c2d6fe0174762f3c85c0eTom Stellard	if (!tokens)
1018b280516e114776c8d34c2d6fe0174762f3c85c0eTom Stellard		return (rscreen->debug_flags & DBG_CS) != 0;
1019b280516e114776c8d34c2d6fe0174762f3c85c0eTom Stellard
10200cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	switch (tgsi_get_processor_type(tokens)) {
10210cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	case TGSI_PROCESSOR_VERTEX:
10220cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_VS) != 0;
1023c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák	case TGSI_PROCESSOR_TESS_CTRL:
1024c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák		return (rscreen->debug_flags & DBG_TCS) != 0;
1025c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák	case TGSI_PROCESSOR_TESS_EVAL:
1026c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák		return (rscreen->debug_flags & DBG_TES) != 0;
10270cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	case TGSI_PROCESSOR_GEOMETRY:
10280cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_GS) != 0;
10290cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	case TGSI_PROCESSOR_FRAGMENT:
10300cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_PS) != 0;
10310cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	case TGSI_PROCESSOR_COMPUTE:
10320cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_CS) != 0;
10330cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	default:
10340cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return false;
10350cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	}
10360cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák}
103768f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
103868f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšákvoid r600_screen_clear_buffer(struct r600_common_screen *rscreen, struct pipe_resource *dst,
1039edf18da85dd3b1865c4faaba650a8fa371b7103cMarek Olšák			      unsigned offset, unsigned size, unsigned value,
1040edf18da85dd3b1865c4faaba650a8fa371b7103cMarek Olšák			      bool is_framebuffer)
104168f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák{
104268f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	struct r600_common_context *rctx = (struct r600_common_context*)rscreen->aux_context;
104368f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
104468f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_lock(rscreen->aux_context_lock);
1045edf18da85dd3b1865c4faaba650a8fa371b7103cMarek Olšák	rctx->clear_buffer(&rctx->b, dst, offset, size, value, is_framebuffer);
104668f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	rscreen->aux_context->flush(rscreen->aux_context, NULL, 0);
104768f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_unlock(rscreen->aux_context_lock);
104868f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák}
1049