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>
408539c9bf3158416b22346dc49696872e631e969fMarek Olšák#include <sys/utsname.h>
41d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
42bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák#ifndef HAVE_LLVM
43bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák#define HAVE_LLVM 0
44bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák#endif
45bed6f20f28af8bf531c14e3cab12a00354a313fcMarek Olšák
4642920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák#ifndef MESA_LLVM_VERSION_PATCH
4742920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák#define MESA_LLVM_VERSION_PATCH 0
4842920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák#endif
4942920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák
503b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšákstruct r600_multi_fence {
513b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_reference reference;
523b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *gfx;
533b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *sdma;
543f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák
553f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	/* If the context wasn't flushed at fence creation, this is non-NULL. */
563f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	struct {
573f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		struct r600_common_context *ctx;
583f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		unsigned ib_index;
593f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	} gfx_unflushed;
603b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák};
613b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
62f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák/*
63efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely * shader binary helpers.
64efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely */
65efc4142acd0e5e43b9896440c1c8191d41ff273aJan Veselyvoid radeon_shader_binary_init(struct radeon_shader_binary *b)
66efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely{
67efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	memset(b, 0, sizeof(*b));
68efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely}
69efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely
70efc4142acd0e5e43b9896440c1c8191d41ff273aJan Veselyvoid radeon_shader_binary_clean(struct radeon_shader_binary *b)
71efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely{
72efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	if (!b)
73efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely		return;
74efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	FREE(b->code);
75efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	FREE(b->config);
76efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	FREE(b->rodata);
77efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	FREE(b->global_symbol_offsets);
78efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	FREE(b->relocs);
79efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely	FREE(b->disasm_string);
80027ad71b57a0bec882c604027dc83f42eb2eb54cMarek Olšák	FREE(b->llvm_ir_string);
81efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely}
82efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely
83efc4142acd0e5e43b9896440c1c8191d41ff273aJan Vesely/*
84f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák * pipe_context
85f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák */
86f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
87462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák/**
88462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * Write an EOP event.
89462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák *
90462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * \param event		EVENT_TYPE_*
91462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * \param event_flags	Optional cache flush flags (TC)
92462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * \param data_sel	1 = fence, 3 = timestamp
93462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * \param buf		Buffer
94462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * \param va		GPU address
95462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * \param old_value	Previous fence value (for a bug workaround)
96462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák * \param new_value	Fence value to write for this event.
97462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák */
98462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšákvoid r600_gfx_write_event_eop(struct r600_common_context *ctx,
99462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák			      unsigned event, unsigned event_flags,
100462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák			      unsigned data_sel,
101462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák			      struct r600_resource *buf, uint64_t va,
102462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák			      uint32_t old_fence, uint32_t new_fence)
1038d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle{
1048d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	struct radeon_winsys_cs *cs = ctx->gfx.cs;
105462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák	unsigned op = EVENT_TYPE(event) |
106462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák		      EVENT_INDEX(5) |
107462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák		      event_flags;
1088d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
109bacf9b4e735cc9d96acd2d507dfb2fc8831966a3Marek Olšák	if (ctx->chip_class == CIK ||
110bacf9b4e735cc9d96acd2d507dfb2fc8831966a3Marek Olšák	    ctx->chip_class == VI) {
1118d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		/* Two EOP events are required to make all engines go idle
1128d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		 * (and optional cache flushes executed) before the timestamp
1138d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		 * is written.
1148d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		 */
1158d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, 0));
116462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák		radeon_emit(cs, op);
1178d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		radeon_emit(cs, va);
118462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák		radeon_emit(cs, ((va >> 32) & 0xffff) | EOP_DATA_SEL(data_sel));
119462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák		radeon_emit(cs, old_fence); /* immediate data */
1208d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		radeon_emit(cs, 0); /* unused */
1218d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	}
1228d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
1238d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, 0));
124462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák	radeon_emit(cs, op);
1258d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, va);
126462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák	radeon_emit(cs, ((va >> 32) & 0xffff) | EOP_DATA_SEL(data_sel));
127462e3cdf3b92464dab57da2b9e00986f8e6091beMarek Olšák	radeon_emit(cs, new_fence); /* immediate data */
1288d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, 0); /* unused */
129fd9f54223dd8056bc4e9e17c53fe075e33a40f1fNicolai Hähnle
130dc6bbe2dd0eb9ba421c8454b3b6179a6b0452b40Marek Olšák	if (buf)
131dc6bbe2dd0eb9ba421c8454b3b6179a6b0452b40Marek Olšák		r600_emit_reloc(ctx, &ctx->gfx, buf, RADEON_USAGE_WRITE,
132dc6bbe2dd0eb9ba421c8454b3b6179a6b0452b40Marek Olšák				RADEON_PRIO_QUERY);
1338d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle}
1348d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
1358d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnleunsigned r600_gfx_write_fence_dwords(struct r600_common_screen *screen)
1368d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle{
1378d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	unsigned dwords = 6;
1388d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
139bacf9b4e735cc9d96acd2d507dfb2fc8831966a3Marek Olšák	if (screen->chip_class == CIK ||
140bacf9b4e735cc9d96acd2d507dfb2fc8831966a3Marek Olšák	    screen->chip_class == VI)
1418d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle		dwords *= 2;
1428d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
143fd9f54223dd8056bc4e9e17c53fe075e33a40f1fNicolai Hähnle	if (!screen->info.has_virtual_memory)
144fd9f54223dd8056bc4e9e17c53fe075e33a40f1fNicolai Hähnle		dwords += 2;
145fd9f54223dd8056bc4e9e17c53fe075e33a40f1fNicolai Hähnle
1468d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	return dwords;
1478d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle}
1488d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
1498d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnlevoid r600_gfx_wait_fence(struct r600_common_context *ctx,
1508d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle			 uint64_t va, uint32_t ref, uint32_t mask)
1518d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle{
1528d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	struct radeon_winsys_cs *cs = ctx->gfx.cs;
1538d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
1548d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, PKT3(PKT3_WAIT_REG_MEM, 5, 0));
1558d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, WAIT_REG_MEM_EQUAL | WAIT_REG_MEM_MEM_SPACE(1));
1568d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, va);
1578d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, va >> 32);
1588d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, ref); /* reference value */
1598d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, mask); /* mask */
1608d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle	radeon_emit(cs, 4); /* poll interval */
1618d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle}
1628d45243e400d6d426a1aae735f8ccad608484584Nicolai Hähnle
163db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšákvoid r600_draw_rectangle(struct blitter_context *blitter,
164db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák			 int x1, int y1, int x2, int y2, float depth,
165db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák			 enum blitter_attrib_type type,
166db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák			 const union pipe_color_union *attrib)
167db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák{
168db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	struct r600_common_context *rctx =
169db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		(struct r600_common_context*)util_blitter_get_pipe(blitter);
170db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	struct pipe_viewport_state viewport;
171db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	struct pipe_resource *buf = NULL;
172db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	unsigned offset = 0;
173db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	float *vb;
174db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
175db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	if (type == UTIL_BLITTER_ATTRIB_TEXCOORD) {
176db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		util_blitter_draw_rectangle(blitter, x1, y1, x2, y2, depth, type, attrib);
177db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		return;
178db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	}
179db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
180db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* Some operations (like color resolve on r6xx) don't work
181db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * with the conventional primitive types.
182db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * One that works is PT_RECTLIST, which we use here. */
183db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
184db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* setup viewport */
185db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.scale[0] = 1.0f;
186db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.scale[1] = 1.0f;
187db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.scale[2] = 1.0f;
188db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.translate[0] = 0.0f;
189db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.translate[1] = 0.0f;
190db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	viewport.translate[2] = 0.0f;
191db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	rctx->b.set_viewport_states(&rctx->b, 0, 1, &viewport);
192db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
193db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* Upload vertices. The hw rectangle has only 3 vertices,
194db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * I guess the 4th one is derived from the first 3.
195db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	 * The vertex specification should match u_blitter's vertex element state. */
196020009f7ccdffa84c6e1649c4e915954f5fd7cc0Marek Olšák	u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, 256, &offset, &buf, (void**)&vb);
197f95e695059c428a21a1e1a27d5cd5ccce2a97b0eMarek Olšák	if (!buf)
198f95e695059c428a21a1e1a27d5cd5ccce2a97b0eMarek Olšák		return;
199f95e695059c428a21a1e1a27d5cd5ccce2a97b0eMarek Olšák
200db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[0] = x1;
201db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[1] = y1;
202db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[2] = depth;
203db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[3] = 1;
204db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
205db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[8] = x1;
206db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[9] = y2;
207db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[10] = depth;
208db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[11] = 1;
209db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
210db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[16] = x2;
211db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[17] = y1;
212db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[18] = depth;
213db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	vb[19] = 1;
214db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
215db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	if (attrib) {
216db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		memcpy(vb+4, attrib->f, sizeof(float)*4);
217db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		memcpy(vb+12, attrib->f, sizeof(float)*4);
218db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák		memcpy(vb+20, attrib->f, sizeof(float)*4);
219db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	}
220db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
221db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	/* draw */
222db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	util_draw_vertex_buffer(&rctx->b, NULL, buf, blitter->vb_slot, offset,
223db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák				R600_PRIM_RECTANGLE_LIST, 3, 2);
224db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák	pipe_resource_reference(&buf, NULL);
225db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák}
226db51ab6d6ada69287dfe3a671ecc1b338917e7aaMarek Olšák
2279e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšákstatic void r600_dma_emit_wait_idle(struct r600_common_context *rctx)
2289e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák{
2299e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	struct radeon_winsys_cs *cs = rctx->dma.cs;
2309e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák
2319e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	/* NOP waits for idle on Evergreen and later. */
2329e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	if (rctx->chip_class >= CIK)
2339e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák		radeon_emit(cs, 0x00000000); /* NOP */
2349e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	else if (rctx->chip_class >= EVERGREEN)
2359e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák		radeon_emit(cs, 0xf0000000); /* NOP */
2369e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	else {
2379e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák		/* TODO: R600-R700 should use the FENCE packet.
2389e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák		 * CS checker support is required. */
2399e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	}
2409e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák}
2419e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák
242bb74152597de44ee877b8928587b1cece8b49656Marek Olšákvoid r600_need_dma_space(struct r600_common_context *ctx, unsigned num_dw,
243bb74152597de44ee877b8928587b1cece8b49656Marek Olšák                         struct r600_resource *dst, struct r600_resource *src)
244acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider{
2453be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	uint64_t vram = ctx->dma.cs->used_vram;
2463be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	uint64_t gtt = ctx->dma.cs->used_gart;
247bb74152597de44ee877b8928587b1cece8b49656Marek Olšák
248bb74152597de44ee877b8928587b1cece8b49656Marek Olšák	if (dst) {
249f4b977bf3dba2b68ebda5b2c0823e4cc6d80192bMarek Olšák		vram += dst->vram_usage;
250f4b977bf3dba2b68ebda5b2c0823e4cc6d80192bMarek Olšák		gtt += dst->gart_usage;
251bb74152597de44ee877b8928587b1cece8b49656Marek Olšák	}
252bb74152597de44ee877b8928587b1cece8b49656Marek Olšák	if (src) {
253f4b977bf3dba2b68ebda5b2c0823e4cc6d80192bMarek Olšák		vram += src->vram_usage;
254f4b977bf3dba2b68ebda5b2c0823e4cc6d80192bMarek Olšák		gtt += src->gart_usage;
255bb74152597de44ee877b8928587b1cece8b49656Marek Olšák	}
256bb74152597de44ee877b8928587b1cece8b49656Marek Olšák
2572b58bc44615c2ac61a0ff35cc69c8aae2b501083Marek Olšák	/* Flush the GFX IB if DMA depends on it. */
2580558564200466878f1a86e7a192d085b551079c4Nicolai Hähnle	if (radeon_emitted(ctx->gfx.cs, ctx->initial_gfx_cs_size) &&
2592b58bc44615c2ac61a0ff35cc69c8aae2b501083Marek Olšák	    ((dst &&
2602b58bc44615c2ac61a0ff35cc69c8aae2b501083Marek Olšák	      ctx->ws->cs_is_buffer_referenced(ctx->gfx.cs, dst->buf,
2612b58bc44615c2ac61a0ff35cc69c8aae2b501083Marek Olšák					       RADEON_USAGE_READWRITE)) ||
2622b58bc44615c2ac61a0ff35cc69c8aae2b501083Marek Olšák	     (src &&
2632b58bc44615c2ac61a0ff35cc69c8aae2b501083Marek Olšák	      ctx->ws->cs_is_buffer_referenced(ctx->gfx.cs, src->buf,
2642b58bc44615c2ac61a0ff35cc69c8aae2b501083Marek Olšák					       RADEON_USAGE_WRITE))))
2656cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		ctx->gfx.flush(ctx, RADEON_FLUSH_ASYNC, NULL);
26681d412e02ce7db644774202b175f1f24b1f262c7Marek Olšák
267bb74152597de44ee877b8928587b1cece8b49656Marek Olšák	/* Flush if there's not enough space, or if the memory usage per IB
268bb74152597de44ee877b8928587b1cece8b49656Marek Olšák	 * is too large.
2693be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 *
2703be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 * IBs using too little memory are limited by the IB submission overhead.
2713be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 * IBs using too much memory are limited by the kernel/TTM overhead.
2723be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 * Too long IBs create CPU-GPU pipeline bubbles and add latency.
2733be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 *
2743be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 * This heuristic makes sure that DMA requests are executed
2753be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 * very soon after the call is made and lowers memory usage.
2763be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 * It improves texture upload performance by keeping the DMA
2773be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	 * engine busy while uploads are being submitted.
278bb74152597de44ee877b8928587b1cece8b49656Marek Olšák	 */
2799e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	num_dw++; /* for emit_wait_idle below */
280d6211a61b0c8cd81509cbbf0e75766eb4be30bedNicolai Hähnle	if (!ctx->ws->cs_check_space(ctx->dma.cs, num_dw) ||
2813be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	    ctx->dma.cs->used_vram + ctx->dma.cs->used_gart > 64 * 1024 * 1024 ||
282c5ff0d3e65d499dcb466c151ed48cdf67e43cdbbMarek Olšák	    !radeon_cs_memory_below_limit(ctx->screen, ctx->dma.cs, vram, gtt)) {
2836cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		ctx->dma.flush(ctx, RADEON_FLUSH_ASYNC, NULL);
28489ba076de4c8cfa171365700e6a3b017d5e3eeffNicolai Hähnle		assert((num_dw + ctx->dma.cs->current.cdw) <= ctx->dma.cs->current.max_dw);
285acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider	}
286fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák
2879e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	/* Wait for idle if either buffer has been used in the IB before to
2889e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	 * prevent read-after-write hazards.
2899e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	 */
2909e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	if ((dst &&
2919e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	     ctx->ws->cs_is_buffer_referenced(ctx->dma.cs, dst->buf,
2929e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák					      RADEON_USAGE_READWRITE)) ||
2939e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	    (src &&
2949e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák	     ctx->ws->cs_is_buffer_referenced(ctx->dma.cs, src->buf,
2959e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák					      RADEON_USAGE_WRITE)))
2969e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák		r600_dma_emit_wait_idle(ctx);
2979e1aa81dfeced2381aa0df73758dd76f2722d857Marek Olšák
298fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák	/* If GPUVM is not supported, the CS checker needs 2 entries
299fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák	 * in the buffer list per packet, which has to be done manually.
300fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák	 */
301fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák	if (ctx->screen->info.has_virtual_memory) {
302fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák		if (dst)
303fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák			radeon_add_to_buffer_list(ctx, &ctx->dma, dst,
304fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák						  RADEON_USAGE_WRITE,
305fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák						  RADEON_PRIO_SDMA_BUFFER);
306fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák		if (src)
307fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák			radeon_add_to_buffer_list(ctx, &ctx->dma, src,
308fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák						  RADEON_USAGE_READ,
309fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák						  RADEON_PRIO_SDMA_BUFFER);
310fb89f066983eb3799bb05e2570dbbf66639f4818Marek Olšák	}
3113be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák
3123be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	/* this function is called before all DMA calls, so increment this. */
3133be83364405da8d5b7085512fcd80c0d910dffd9Marek Olšák	ctx->num_dma_calls++;
314acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider}
315acf55e73252e46fa51378ef4b23c94a89902ae1cNiels Ole Salscheider
3166381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšákstatic void r600_memory_barrier(struct pipe_context *ctx, unsigned flags)
3176381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšák{
3186381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšák}
3196381dd7e9dd22987df21624965cc82cbeec237a3Marek Olšák
32011459436d9314681087463f2c006c58b6fcff396Marek Olšákvoid r600_preflush_suspend_features(struct r600_common_context *ctx)
32111459436d9314681087463f2c006c58b6fcff396Marek Olšák{
32211459436d9314681087463f2c006c58b6fcff396Marek Olšák	/* suspend queries */
3230222351fc114b9b8a34cd79598fb3f0fb4a75b0eMarek Olšák	if (!LIST_IS_EMPTY(&ctx->active_queries))
3240222351fc114b9b8a34cd79598fb3f0fb4a75b0eMarek Olšák		r600_suspend_queries(ctx);
32511459436d9314681087463f2c006c58b6fcff396Marek Olšák
32611459436d9314681087463f2c006c58b6fcff396Marek Olšák	ctx->streamout.suspended = false;
32711459436d9314681087463f2c006c58b6fcff396Marek Olšák	if (ctx->streamout.begin_emitted) {
32811459436d9314681087463f2c006c58b6fcff396Marek Olšák		r600_emit_streamout_end(ctx);
32911459436d9314681087463f2c006c58b6fcff396Marek Olšák		ctx->streamout.suspended = true;
33011459436d9314681087463f2c006c58b6fcff396Marek Olšák	}
33111459436d9314681087463f2c006c58b6fcff396Marek Olšák}
33211459436d9314681087463f2c006c58b6fcff396Marek Olšák
33311459436d9314681087463f2c006c58b6fcff396Marek Olšákvoid r600_postflush_resume_features(struct r600_common_context *ctx)
33411459436d9314681087463f2c006c58b6fcff396Marek Olšák{
33511459436d9314681087463f2c006c58b6fcff396Marek Olšák	if (ctx->streamout.suspended) {
33611459436d9314681087463f2c006c58b6fcff396Marek Olšák		ctx->streamout.append_bitmask = ctx->streamout.enabled_mask;
33711459436d9314681087463f2c006c58b6fcff396Marek Olšák		r600_streamout_buffers_dirty(ctx);
33811459436d9314681087463f2c006c58b6fcff396Marek Olšák	}
33911459436d9314681087463f2c006c58b6fcff396Marek Olšák
34011459436d9314681087463f2c006c58b6fcff396Marek Olšák	/* resume queries */
3410222351fc114b9b8a34cd79598fb3f0fb4a75b0eMarek Olšák	if (!LIST_IS_EMPTY(&ctx->active_queries))
3420222351fc114b9b8a34cd79598fb3f0fb4a75b0eMarek Olšák		r600_resume_queries(ctx);
34311459436d9314681087463f2c006c58b6fcff396Marek Olšák}
34411459436d9314681087463f2c006c58b6fcff396Marek Olšák
345adfadeadd8316e95626fec4771393d32a70af649Marek Olšákstatic void r600_flush_from_st(struct pipe_context *ctx,
346adfadeadd8316e95626fec4771393d32a70af649Marek Olšák			       struct pipe_fence_handle **fence,
347adfadeadd8316e95626fec4771393d32a70af649Marek Olšák			       unsigned flags)
348adfadeadd8316e95626fec4771393d32a70af649Marek Olšák{
3493b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_screen *screen = ctx->screen;
350adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
351fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák	struct radeon_winsys *ws = rctx->ws;
352adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	unsigned rflags = 0;
3533b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *gfx_fence = NULL;
3543b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct pipe_fence_handle *sdma_fence = NULL;
3553f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	bool deferred_fence = false;
356adfadeadd8316e95626fec4771393d32a70af649Marek Olšák
357adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	if (flags & PIPE_FLUSH_END_OF_FRAME)
358adfadeadd8316e95626fec4771393d32a70af649Marek Olšák		rflags |= RADEON_FLUSH_END_OF_FRAME;
3592e890b535012d76d190776368b7f82aad2668461Marek Olšák	if (flags & PIPE_FLUSH_DEFERRED)
3602e890b535012d76d190776368b7f82aad2668461Marek Olšák		rflags |= RADEON_FLUSH_ASYNC;
361adfadeadd8316e95626fec4771393d32a70af649Marek Olšák
362e16245b3393911d703b688adb3ebf161e0b9ba8aMarek Olšák	/* DMA IBs are preambles to gfx IBs, therefore must be flushed first. */
363e16245b3393911d703b688adb3ebf161e0b9ba8aMarek Olšák	if (rctx->dma.cs)
3646cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->dma.flush(rctx, rflags, fence ? &sdma_fence : NULL);
3653f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák
366fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák	if (!radeon_emitted(rctx->gfx.cs, rctx->initial_gfx_cs_size)) {
367fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		if (fence)
368fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák			ws->fence_reference(&gfx_fence, rctx->last_gfx_fence);
369fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		if (!(rflags & RADEON_FLUSH_ASYNC))
370fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák			ws->cs_sync_flush(rctx->gfx.cs);
3713f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	} else {
372fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		/* Instead of flushing, create a deferred fence. Constraints:
373fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		 * - The state tracker must allow a deferred flush.
374fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		 * - The state tracker must request a fence.
375fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		 * Thread safety in fence_finish must be ensured by the state tracker.
376fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		 */
377fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		if (flags & PIPE_FLUSH_DEFERRED && fence) {
378fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák			gfx_fence = rctx->ws->cs_get_next_fence(rctx->gfx.cs);
379fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák			deferred_fence = true;
380fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		} else {
381fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák			rctx->gfx.flush(rctx, rflags, fence ? &gfx_fence : NULL);
382fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		}
3833f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	}
3843b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
3853b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	/* Both engines can signal out of order, so we need to keep both fences. */
386fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák	if (fence) {
3873b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		struct r600_multi_fence *multi_fence =
3883b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			CALLOC_STRUCT(r600_multi_fence);
3893b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		if (!multi_fence)
3903b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			return;
3913b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
3923b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		multi_fence->reference.count = 1;
393fe91ae06d3ecc2080b61a6bc35867653de0da418Marek Olšák		/* If both fences are NULL, fence_finish will always return true. */
3943b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		multi_fence->gfx = gfx_fence;
3953b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		multi_fence->sdma = sdma_fence;
3963b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
3973f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		if (deferred_fence) {
3983f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák			multi_fence->gfx_unflushed.ctx = rctx;
3993f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák			multi_fence->gfx_unflushed.ib_index = rctx->num_gfx_cs_flushes;
4003f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		}
4013f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák
4023b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		screen->fence_reference(screen, fence, NULL);
4033b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		*fence = (struct pipe_fence_handle*)multi_fence;
404adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	}
405adfadeadd8316e95626fec4771393d32a70af649Marek Olšák}
406adfadeadd8316e95626fec4771393d32a70af649Marek Olšák
40770cf6639c331342619e65c46db925d115bf51920Marek Olšákstatic void r600_flush_dma_ring(void *ctx, unsigned flags,
40870cf6639c331342619e65c46db925d115bf51920Marek Olšák				struct pipe_fence_handle **fence)
409087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider{
410087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
4116cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	struct radeon_winsys_cs *cs = rctx->dma.cs;
412d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	struct radeon_saved_cs saved;
413d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	bool check_vm =
414d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		(rctx->screen->debug_flags & DBG_CHECK_VM) &&
415d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		rctx->check_vm_faults;
416d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle
417d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	if (!radeon_emitted(cs, 0)) {
418d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		if (fence)
419d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle			rctx->ws->fence_reference(fence, rctx->last_sdma_fence);
420d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		return;
421d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	}
422d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle
423d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	if (check_vm)
424d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		radeon_save_cs(rctx->ws, cs, &saved);
425087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider
426d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	rctx->ws->cs_flush(cs, flags, &rctx->last_sdma_fence);
4277f9122c9680a882fee5a9d5a8e09c3e3b7466937Marek Olšák	if (fence)
4287f9122c9680a882fee5a9d5a8e09c3e3b7466937Marek Olšák		rctx->ws->fence_reference(fence, rctx->last_sdma_fence);
429d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle
430d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	if (check_vm) {
431d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		/* Use conservative timeout 800ms, after which we won't wait any
432d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		 * longer and assume the GPU is hung.
433d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		 */
434d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		rctx->ws->fence_wait(rctx->ws, rctx->last_sdma_fence, 800*1000*1000);
435d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle
436d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		rctx->check_vm_faults(rctx, &saved, RING_DMA);
437d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle		radeon_clear_saved_cs(&saved);
438d46a9db840b8f82c079a6610723e8a6c519c46cdNicolai Hähnle	}
439087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider}
440087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider
441ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle/**
442ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle * Store a linearized copy of all chunks of \p cs together with the buffer
443ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle * list in \p saved.
444ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle */
445ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnlevoid radeon_save_cs(struct radeon_winsys *ws, struct radeon_winsys_cs *cs,
446ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle		    struct radeon_saved_cs *saved)
447ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle{
448ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	void *buf;
449ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	unsigned i;
450ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
451ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	/* Save the IB chunks. */
452ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	saved->num_dw = cs->prev_dw + cs->current.cdw;
453ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	saved->ib = MALLOC(4 * saved->num_dw);
454ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	if (!saved->ib)
455ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle		goto oom;
456ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
457ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	buf = saved->ib;
458ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	for (i = 0; i < cs->num_prev; ++i) {
459ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle		memcpy(buf, cs->prev[i].buf, cs->prev[i].cdw * 4);
460ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle		buf += cs->prev[i].cdw;
461ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	}
462ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	memcpy(buf, cs->current.buf, cs->current.cdw * 4);
463ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
464ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	/* Save the buffer list. */
465ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	saved->bo_count = ws->cs_get_buffer_list(cs, NULL);
466ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	saved->bo_list = CALLOC(saved->bo_count,
467ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle				sizeof(saved->bo_list[0]));
468ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	if (!saved->bo_list) {
469ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle		FREE(saved->ib);
470ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle		goto oom;
471ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	}
472ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	ws->cs_get_buffer_list(cs, saved->bo_list);
473ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
474ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	return;
475ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
476ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnleoom:
477ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	fprintf(stderr, "%s: out of memory\n", __func__);
478ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	memset(saved, 0, sizeof(*saved));
479ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle}
480ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
481ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnlevoid radeon_clear_saved_cs(struct radeon_saved_cs *saved)
482ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle{
483ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	FREE(saved->ib);
484ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	FREE(saved->bo_list);
485ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
486ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle	memset(saved, 0, sizeof(*saved));
487ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle}
488ad8438403b32088260ec845fc2e7304586328913Nicolai Hähnle
489914365c0eb039f66370cff166428c703e02ad510Marek Olšákstatic enum pipe_reset_status r600_get_reset_status(struct pipe_context *ctx)
490914365c0eb039f66370cff166428c703e02ad510Marek Olšák{
491914365c0eb039f66370cff166428c703e02ad510Marek Olšák	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
492914365c0eb039f66370cff166428c703e02ad510Marek Olšák	unsigned latest = rctx->ws->query_value(rctx->ws,
493914365c0eb039f66370cff166428c703e02ad510Marek Olšák						RADEON_GPU_RESET_COUNTER);
494914365c0eb039f66370cff166428c703e02ad510Marek Olšák
495914365c0eb039f66370cff166428c703e02ad510Marek Olšák	if (rctx->gpu_reset_counter == latest)
496914365c0eb039f66370cff166428c703e02ad510Marek Olšák		return PIPE_NO_RESET;
497914365c0eb039f66370cff166428c703e02ad510Marek Olšák
498914365c0eb039f66370cff166428c703e02ad510Marek Olšák	rctx->gpu_reset_counter = latest;
499914365c0eb039f66370cff166428c703e02ad510Marek Olšák	return PIPE_UNKNOWN_CONTEXT_RESET;
500914365c0eb039f66370cff166428c703e02ad510Marek Olšák}
501914365c0eb039f66370cff166428c703e02ad510Marek Olšák
502b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnlestatic void r600_set_debug_callback(struct pipe_context *ctx,
503b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle				    const struct pipe_debug_callback *cb)
504b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle{
505b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
506b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle
507b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	if (cb)
508b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle		rctx->debug = *cb;
509b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	else
510b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle		memset(&rctx->debug, 0, sizeof(rctx->debug));
511b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle}
512b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle
513b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnlestatic void r600_set_device_reset_callback(struct pipe_context *ctx,
514b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle					   const struct pipe_device_reset_callback *cb)
515b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle{
516b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
517b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
518b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	if (cb)
519b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle		rctx->device_reset_callback = *cb;
520b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	else
521b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle		memset(&rctx->device_reset_callback, 0,
522b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle		       sizeof(rctx->device_reset_callback));
523b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle}
524b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
525b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnlebool r600_check_device_reset(struct r600_common_context *rctx)
526b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle{
527b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	enum pipe_reset_status status;
528b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
529b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	if (!rctx->device_reset_callback.reset)
530b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle		return false;
531b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
532b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	if (!rctx->b.get_device_reset_status)
533b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle		return false;
534b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
535b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	status = rctx->b.get_device_reset_status(&rctx->b);
536b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	if (status == PIPE_NO_RESET)
537b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle		return false;
538b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
539b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	rctx->device_reset_callback.reset(rctx->device_reset_callback.data, status);
540b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	return true;
541b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle}
542b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
543d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšákstatic void r600_dma_clear_buffer_fallback(struct pipe_context *ctx,
544d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšák					   struct pipe_resource *dst,
545d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšák					   uint64_t offset, uint64_t size,
546d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšák					   unsigned value)
547d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšák{
548aead6a1e947af84b0af2853c204d5cad6d92bfffMarek Olšák	struct r600_common_context *rctx = (struct r600_common_context *)ctx;
549aead6a1e947af84b0af2853c204d5cad6d92bfffMarek Olšák
550aead6a1e947af84b0af2853c204d5cad6d92bfffMarek Olšák	rctx->clear_buffer(ctx, dst, offset, size, value, R600_COHERENCY_NONE);
551d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšák}
552d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšák
553f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšákbool r600_common_context_init(struct r600_common_context *rctx,
554700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák			      struct r600_common_screen *rscreen,
555700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák			      unsigned context_flags)
556f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák{
557e56e1f8119f28eebbe6fbe7040c80a6dd884f5fdNicolai Hähnle	slab_create_child(&rctx->pool_transfers, &rscreen->pool_transfers);
558f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
559f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->screen = rscreen;
560f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->ws = rscreen->ws;
561f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->family = rscreen->family;
562f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->chip_class = rscreen->chip_class;
56371ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák
564bfc14796b077444011c81f544ceec5d8592c5c77Marek Olšák	if (rscreen->chip_class >= CIK)
5651e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		rctx->max_db = MAX2(8, rscreen->info.num_render_backends);
56671ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák	else if (rscreen->chip_class >= EVERGREEN)
56771ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák		rctx->max_db = 8;
56871ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák	else
56971ce92200e0314a0878088dec8c0c2a0270bc4dcMarek Olšák		rctx->max_db = 4;
570f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
571321140d563730b210e6390c5b73c09fdcf9649afNicolai Hähnle	rctx->b.invalidate_resource = r600_invalidate_resource;
572f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->b.transfer_map = u_transfer_map_vtbl;
573b409524fef1b02c717b4cc1fef70d5710781f824Marek Olšák	rctx->b.transfer_flush_region = u_transfer_flush_region_vtbl;
574f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	rctx->b.transfer_unmap = u_transfer_unmap_vtbl;
5751ffe77e7bb2486ea74cda077ed2a9622b758395cMarek Olšák	rctx->b.texture_subdata = u_default_texture_subdata;
5761ffe77e7bb2486ea74cda077ed2a9622b758395cMarek Olšák	rctx->b.memory_barrier = r600_memory_barrier;
577adfadeadd8316e95626fec4771393d32a70af649Marek Olšák	rctx->b.flush = r600_flush_from_st;
578b6847062dd5c504023dfbef8e6b3118136ee506cNicolai Hähnle	rctx->b.set_debug_callback = r600_set_debug_callback;
579d4c0ad4de8c4eeec1cc0478b12ce542e9a7faa0fMarek Olšák	rctx->dma_clear_buffer = r600_dma_clear_buffer_fallback;
580f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
581700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák	/* evergreen_compute.c has a special codepath for global buffers.
582700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák	 * Everything else can use the direct path.
583700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák	 */
584700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák	if ((rscreen->chip_class == EVERGREEN || rscreen->chip_class == CAYMAN) &&
585700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák	    (context_flags & PIPE_CONTEXT_COMPUTE_ONLY))
586700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák		rctx->b.buffer_subdata = u_default_buffer_subdata;
587700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák	else
588700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák		rctx->b.buffer_subdata = r600_buffer_subdata;
589700de07771a1b6ce2a63b063fcc196c5b26cffe3Marek Olšák
590914365c0eb039f66370cff166428c703e02ad510Marek Olšák	if (rscreen->info.drm_major == 2 && rscreen->info.drm_minor >= 43) {
591914365c0eb039f66370cff166428c703e02ad510Marek Olšák		rctx->b.get_device_reset_status = r600_get_reset_status;
592914365c0eb039f66370cff166428c703e02ad510Marek Olšák		rctx->gpu_reset_counter =
593914365c0eb039f66370cff166428c703e02ad510Marek Olšák			rctx->ws->query_value(rctx->ws,
594914365c0eb039f66370cff166428c703e02ad510Marek Olšák					      RADEON_GPU_RESET_COUNTER);
595914365c0eb039f66370cff166428c703e02ad510Marek Olšák	}
596914365c0eb039f66370cff166428c703e02ad510Marek Olšák
597b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle	rctx->b.set_device_reset_callback = r600_set_device_reset_callback;
598b5cd7dfe3e9a04bf6edd5d100f7c74b8fcb5c277Nicolai Hähnle
5999855477e903e00f7457adb15594048416444b992Marek Olšák	r600_init_context_texture_functions(rctx);
6002ca5566ed7847f5a56d055fd6530382c55012663Marek Olšák	r600_init_viewport_functions(rctx);
601f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	r600_streamout_init(rctx);
602f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	r600_query_init(rctx);
60399d9d7c0d69c076d84334892ee12f921fe243319Marek Olšák	cayman_init_msaa(&rctx->b);
604f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
605ee0c96c11eb3bee5010e5a22ff18d51cd948c075Marek Olšák	rctx->allocator_zeroed_memory =
606544967faf59b20b6254d713fca94f6e9aa86754cMarek Olšák		u_suballocator_create(&rctx->b, rscreen->info.gart_page_size,
6077db10093d3ee26b0a5050ae01750465da1a76970Marek Olšák				      0, PIPE_USAGE_DEFAULT, true);
608ee0c96c11eb3bee5010e5a22ff18d51cd948c075Marek Olšák	if (!rctx->allocator_zeroed_memory)
609f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		return false;
610f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
61137d0aea772a39f9ae7fe3d791e23c1be03ccf9deMarek Olšák	rctx->uploader = u_upload_create(&rctx->b, 1024 * 1024,
612f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák					PIPE_BIND_INDEX_BUFFER |
613ecb2da1559bcb9a9eec7ac224c8ff47b026c95ffMarek Olšák					PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STREAM);
614f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (!rctx->uploader)
615f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		return false;
616f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
61742d9f6323a523d786fc3797587fdf63048beccebMarek Olšák	rctx->ctx = rctx->ws->ctx_create(rctx->ws);
61842d9f6323a523d786fc3797587fdf63048beccebMarek Olšák	if (!rctx->ctx)
61942d9f6323a523d786fc3797587fdf63048beccebMarek Olšák		return false;
62042d9f6323a523d786fc3797587fdf63048beccebMarek Olšák
6211e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák	if (rscreen->info.has_sdma && !(rscreen->debug_flags & DBG_NO_ASYNC_DMA)) {
6226cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->dma.cs = rctx->ws->cs_create(rctx->ctx, RING_DMA,
6236cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák						   r600_flush_dma_ring,
6248140154ae92c6bd022e409790bb069966a857aedMarek Olšák						   rctx);
6256cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->dma.flush = r600_flush_dma_ring;
626087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider	}
627087b0ff1c1f136e5d7e4775b8b8889f1ef7ee1f8Niels Ole Salscheider
628f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	return true;
629f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák}
630f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
631f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšákvoid r600_common_context_cleanup(struct r600_common_context *rctx)
632f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák{
63349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák	unsigned i,j;
63449e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák
63549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák	/* Release DCC stats. */
63649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák	for (i = 0; i < ARRAY_SIZE(rctx->dcc_stats); i++) {
63749e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák		assert(!rctx->dcc_stats[i].query_active);
63849e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák
63949e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák		for (j = 0; j < ARRAY_SIZE(rctx->dcc_stats[i].ps_stats); j++)
64049e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák			if (rctx->dcc_stats[i].ps_stats[j])
64149e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák				rctx->b.destroy_query(&rctx->b,
64249e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák						      rctx->dcc_stats[i].ps_stats[j]);
64349e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák
64436cf5a57c2b53b50778482f7341b7afcdc434dafMarek Olšák		r600_texture_reference(&rctx->dcc_stats[i].tex, NULL);
64549e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák	}
64649e3c74cdd0da5abd6cad1fb14af6cc0d85d76c9Marek Olšák
64715e26611373e6368eb6dd8365007b208668d0508Nicolai Hähnle	if (rctx->query_result_shader)
64815e26611373e6368eb6dd8365007b208668d0508Nicolai Hähnle		rctx->b.delete_compute_state(&rctx->b, rctx->query_result_shader);
64915e26611373e6368eb6dd8365007b208668d0508Nicolai Hähnle
6506cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	if (rctx->gfx.cs)
6516cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->ws->cs_destroy(rctx->gfx.cs);
6526cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák	if (rctx->dma.cs)
6536cc8f6c6a72b1aab7bb506deb220e04ae50d8c2bMarek Olšák		rctx->ws->cs_destroy(rctx->dma.cs);
65442d9f6323a523d786fc3797587fdf63048beccebMarek Olšák	if (rctx->ctx)
65542d9f6323a523d786fc3797587fdf63048beccebMarek Olšák		rctx->ws->ctx_destroy(rctx->ctx);
656f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
657f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	if (rctx->uploader) {
658f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák		u_upload_destroy(rctx->uploader);
659f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	}
660f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
661e56e1f8119f28eebbe6fbe7040c80a6dd884f5fdNicolai Hähnle	slab_destroy_child(&rctx->pool_transfers);
662f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
663ee0c96c11eb3bee5010e5a22ff18d51cd948c075Marek Olšák	if (rctx->allocator_zeroed_memory) {
664ee0c96c11eb3bee5010e5a22ff18d51cd948c075Marek Olšák		u_suballocator_destroy(rctx->allocator_zeroed_memory);
665f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák	}
666a6bfafa083ef4f3320ca45bfc3e5697674e4b12cMarek Olšák	rctx->ws->fence_reference(&rctx->last_gfx_fence, NULL);
6677f9122c9680a882fee5a9d5a8e09c3e3b7466937Marek Olšák	rctx->ws->fence_reference(&rctx->last_sdma_fence, NULL);
668f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák}
669f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
670f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák/*
671f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák * pipe_screen
672f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák */
673f4612105e82834e6f46a70dd90c81e982b6506caMarek Olšák
674ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšákstatic const struct debug_named_value common_debug_options[] = {
675ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	/* logging */
6764e9aa6711f933f9c85c9fd09831060541bc2003aMarek Olšák	{ "tex", DBG_TEX, "Print texture info" },
677ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "compute", DBG_COMPUTE, "Print compute info" },
678ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "vm", DBG_VM, "Print virtual addresses when creating resources" },
679d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák	{ "info", DBG_INFO, "Print driver information" },
680ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák
681ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	/* shaders */
682ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "fs", DBG_FS, "Print fetch shaders" },
683ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "vs", DBG_VS, "Print vertex shaders" },
684ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "gs", DBG_GS, "Print geometry shaders" },
685ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "ps", DBG_PS, "Print pixel shaders" },
686ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	{ "cs", DBG_CS, "Print compute shaders" },
687c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák	{ "tcs", DBG_TCS, "Print tessellation control shaders" },
688c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák	{ "tes", DBG_TES, "Print tessellation evaluation shaders" },
689ac19a896d3de13b7d064d01c575f46f4191ef37cMarek Olšák	{ "noir", DBG_NO_IR, "Don't print the LLVM IR"},
6902dcbd427da74c8f2b6f46e789924a7ced67be260Marek Olšák	{ "notgsi", DBG_NO_TGSI, "Don't print the TGSI"},
6913063c5e3d3fefdc5eed7600882bd08f56bf86db8Marek Olšák	{ "noasm", DBG_NO_ASM, "Don't print disassembled shaders"},
6924b672b831080c5bc1d379e9645e9ccef28939b56Nicolai Hähnle	{ "preoptir", DBG_PREOPT_IR, "Print the LLVM IR before initial optimizations" },
6938b1f9fd3b3e4b7703314278061d7905a6e780ce7Nicolai Hähnle	{ "checkir", DBG_CHECK_IR, "Enable additional sanity checks on shader IR" },
694e5302ad9365844d86ae84df7dcf561c2f2174dc3Marek Olšák	{ "nooptvariant", DBG_NO_OPT_VARIANT, "Disable compiling optimized shader variants." },
695ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák
6963af28e558fb9cf71edd83e8cc9c3ddc33373cc93Marek Olšák	{ "testdma", DBG_TEST_DMA, "Invoke SDMA tests and exit." },
6973af28e558fb9cf71edd83e8cc9c3ddc33373cc93Marek Olšák
698ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	/* features */
699ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	{ "nodma", DBG_NO_ASYNC_DMA, "Disable asynchronous DMA" },
70014bdcc6ff98664552216acfdb7e35d0b128003efAndreas Boll	{ "nohyperz", DBG_NO_HYPERZ, "Disable Hyper-Z" },
701e1374d86fecb58edc9cf9b456b05d74a0034eafdMarek Olšák	/* GL uses the word INVALIDATE, gallium uses the word DISCARD */
702e1374d86fecb58edc9cf9b456b05d74a0034eafdMarek Olšák	{ "noinvalrange", DBG_NO_DISCARD_RANGE, "Disable handling of INVALIDATE_RANGE map flags" },
703ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	{ "no2d", DBG_NO_2D_TILING, "Disable 2D tiling" },
704ecbd3a545a3cb5f2c112ae0b02abfcbb3240ec6fMarek Olšák	{ "notiling", DBG_NO_TILING, "Disable tiling" },
7050e229b8c5aa5eb758cbc9e1176001e0f4d985a6aMarek Olšák	{ "switch_on_eop", DBG_SWITCH_ON_EOP, "Program WD/IA to switch on end-of-packet." },
706d13d2fd16132f351ec7c8184f165faeac3b31bb4Marek Olšák	{ "forcedma", DBG_FORCE_DMA, "Use asynchronous DMA for all operations when possible." },
707b79c620663dc4eab1ad342a7961fa7aa16cff562Marek Olšák	{ "precompile", DBG_PRECOMPILE, "Compile one shader variant at shader creation." },
7087e5d56394bd53607d0158b49f36ac1428acb7954Marek Olšák	{ "nowc", DBG_NO_WC, "Disable GTT write combining" },
7099bd7928a35c27d3d0898db83bc8db823a6dbee5eMarek Olšák	{ "check_vm", DBG_CHECK_VM, "Check VM faults and dump debug info." },
7103aebc596b339b1b787ed0dfc27793263d48b2819Marek Olšák	{ "nodcc", DBG_NO_DCC, "Disable DCC." },
7113aebc596b339b1b787ed0dfc27793263d48b2819Marek Olšák	{ "nodccclear", DBG_NO_DCC_CLEAR, "Disable DCC fast clear." },
712de887ba90ce077a0243269aa0c72a1ab0d2d3ff4Marek Olšák	{ "norbplus", DBG_NO_RB_PLUS, "Disable RB+ on Stoney." },
713dda7a849868d5a4be6cec9d28c86a52aba62b32bAxel Davy	{ "sisched", DBG_SI_SCHED, "Enable LLVM SI Machine Instruction Scheduler." },
7149aaf28da629e025f652c7ff63750ad8ee513ff42Marek Olšák	{ "mono", DBG_MONOLITHIC_SHADERS, "Use old-style monolithic shaders compiled on demand" },
7158fee75d606e83b1f0d665fef9ea59ba24fc6682dBas Nieuwenhuizen	{ "noce", DBG_NO_CE, "Disable the constant engine"},
716b16d21270f9ea0173ebe059a3e82a4b451a80596Marek Olšák	{ "unsafemath", DBG_UNSAFE_MATH, "Enable unsafe math shader optimizations" },
7179fd4eff43c0c1d0e5cb58fafbaa39c7b08bb715aMarek Olšák	{ "nodccfb", DBG_NO_DCC_FB, "Disable separate DCC on the main framebuffer" },
718e1374d86fecb58edc9cf9b456b05d74a0034eafdMarek Olšák
719ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	DEBUG_NAMED_VALUE_END /* must be last */
720ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák};
721ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák
7224df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšákstatic const char* r600_get_vendor(struct pipe_screen* pscreen)
7234df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák{
7244df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	return "X.Org";
7254df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák}
7264df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák
72776039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilottastatic const char* r600_get_device_vendor(struct pipe_screen* pscreen)
72876039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta{
72976039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta	return "AMD";
73076039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta}
73176039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta
732a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšákstatic const char* r600_get_chip_name(struct r600_common_screen *rscreen)
7334df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák{
734a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	switch (rscreen->info.family) {
7354df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_R600: return "AMD R600";
7364df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV610: return "AMD RV610";
7374df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV630: return "AMD RV630";
7384df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV670: return "AMD RV670";
7394df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV620: return "AMD RV620";
7404df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV635: return "AMD RV635";
7414df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RS780: return "AMD RS780";
7424df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RS880: return "AMD RS880";
7434df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV770: return "AMD RV770";
7444df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV730: return "AMD RV730";
7454df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV710: return "AMD RV710";
7464df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_RV740: return "AMD RV740";
7474df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CEDAR: return "AMD CEDAR";
7484df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_REDWOOD: return "AMD REDWOOD";
7494df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_JUNIPER: return "AMD JUNIPER";
7504df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CYPRESS: return "AMD CYPRESS";
7514df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_HEMLOCK: return "AMD HEMLOCK";
7524df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_PALM: return "AMD PALM";
7534df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_SUMO: return "AMD SUMO";
7544df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_SUMO2: return "AMD SUMO2";
7554df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_BARTS: return "AMD BARTS";
7564df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_TURKS: return "AMD TURKS";
7574df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CAICOS: return "AMD CAICOS";
7584df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_CAYMAN: return "AMD CAYMAN";
7594df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_ARUBA: return "AMD ARUBA";
7604df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_TAHITI: return "AMD TAHITI";
7614df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_PITCAIRN: return "AMD PITCAIRN";
7624df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_VERDE: return "AMD CAPE VERDE";
7634df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_OLAND: return "AMD OLAND";
7644df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_HAINAN: return "AMD HAINAN";
7654df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_BONAIRE: return "AMD BONAIRE";
7664df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_KAVERI: return "AMD KAVERI";
7674df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_KABINI: return "AMD KABINI";
7684df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	case CHIP_HAWAII: return "AMD HAWAII";
769aad669b1e90491f7c3951016456e8a2660d91a85Samuel Li	case CHIP_MULLINS: return "AMD MULLINS";
7702d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_TONGA: return "AMD TONGA";
7712d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_ICELAND: return "AMD ICELAND";
7722d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_CARRIZO: return "AMD CARRIZO";
773767ad50a10d01274b1d1a877add12b5552ba6984Alex Deucher	case CHIP_FIJI: return "AMD FIJI";
77442e442d888ce2d3dcb95350d17c298791f5d76ccSonny Jiang	case CHIP_POLARIS10: return "AMD POLARIS10";
77542e442d888ce2d3dcb95350d17c298791f5d76ccSonny Jiang	case CHIP_POLARIS11: return "AMD POLARIS11";
776018ead426666d7d58517976e37f80f5de4a677cdJunwei Zhang	case CHIP_POLARIS12: return "AMD POLARIS12";
777bf0d0ce0d57dce5df8195942d2eda6389d341feaSamuel Li	case CHIP_STONEY: return "AMD STONEY";
7784df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	default: return "AMD unknown";
7794df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	}
7804df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák}
7814df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák
782a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšákstatic const char* r600_get_name(struct pipe_screen* pscreen)
783a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák{
784a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen*)pscreen;
785a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
786a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	return rscreen->renderer_string;
787a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák}
788a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
789d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšákstatic float r600_get_paramf(struct pipe_screen* pscreen,
790d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák			     enum pipe_capf param)
791d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák{
792d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen *)pscreen;
793d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
794d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	switch (param) {
795d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_LINE_WIDTH:
796d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_LINE_WIDTH_AA:
797d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_POINT_WIDTH:
798d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_POINT_WIDTH_AA:
799d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		if (rscreen->family >= CHIP_CEDAR)
800d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák			return 16384.0f;
801d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		else
802d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák			return 8192.0f;
803d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
804d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 16.0f;
805d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
806d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 16.0f;
807d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_LEFT:
808d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_TOP:
809d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_RIGHT:
810d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_CAPF_GUARD_BAND_BOTTOM:
811d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 0.0f;
812d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	}
813d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	return 0.0f;
814d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák}
815d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
816d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšákstatic int r600_get_video_param(struct pipe_screen *screen,
817d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák				enum pipe_video_profile profile,
818d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák				enum pipe_video_entrypoint entrypoint,
819d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák				enum pipe_video_cap param)
820d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák{
821d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	switch (param) {
822d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_SUPPORTED:
823d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return vl_profile_supported(screen, profile, entrypoint);
824d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_NPOT_TEXTURES:
825d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 1;
826d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_MAX_WIDTH:
827d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_MAX_HEIGHT:
828d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return vl_video_buffer_max_size(screen);
829d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_PREFERED_FORMAT:
830d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return PIPE_FORMAT_NV12;
831d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
832d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return false;
833d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
834d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return false;
835d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
836d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return true;
837d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	case PIPE_VIDEO_CAP_MAX_LEVEL:
838d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return vl_level_supported(screen, profile);
839d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	default:
840d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		return 0;
841d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	}
842d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák}
843d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
84465dc588bfd3b8145131340ffe77f216be58378acMarek Olšákconst char *r600_get_llvm_processor_name(enum radeon_family family)
84565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák{
84665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	switch (family) {
84765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_R600:
84865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV630:
84965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV635:
85065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV670:
85165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "r600";
85265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV610:
85365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV620:
85465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RS780:
85565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RS880:
85665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rs880";
85765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV710:
85865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rv710";
85965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV730:
86065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rv730";
86165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV740:
86265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_RV770:
86365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "rv770";
86465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_PALM:
86565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CEDAR:
86665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "cedar";
86765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_SUMO:
86865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_SUMO2:
86965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "sumo";
87065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_REDWOOD:
87165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "redwood";
87265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_JUNIPER:
87365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "juniper";
87465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_HEMLOCK:
87565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CYPRESS:
87665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "cypress";
87765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_BARTS:
87865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "barts";
87965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_TURKS:
88065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "turks";
88165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CAICOS:
88265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "caicos";
88365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_CAYMAN:
88465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák        case CHIP_ARUBA:
88565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return "cayman";
88665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
88765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_TAHITI: return "tahiti";
88865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_PITCAIRN: return "pitcairn";
88965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_VERDE: return "verde";
89065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_OLAND: return "oland";
89165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_HAINAN: return "hainan";
89265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_BONAIRE: return "bonaire";
89365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_KABINI: return "kabini";
89465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_KAVERI: return "kaveri";
89565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case CHIP_HAWAII: return "hawaii";
896aad669b1e90491f7c3951016456e8a2660d91a85Samuel Li	case CHIP_MULLINS:
897aad669b1e90491f7c3951016456e8a2660d91a85Samuel Li		return "mullins";
8982d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_TONGA: return "tonga";
8992d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_ICELAND: return "iceland";
9002d1952e2a5abd273983374b420371d263388bb20Marek Olšák	case CHIP_CARRIZO: return "carrizo";
901a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák	case CHIP_FIJI:
902a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák		return HAVE_LLVM >= 0x0308 ? "fiji" : "carrizo";
903a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák	case CHIP_STONEY:
904a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák		return HAVE_LLVM >= 0x0308 ? "stoney" : "carrizo";
905a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák	case CHIP_POLARIS10:
906a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák		return HAVE_LLVM >= 0x0309 ? "polaris10" : "carrizo";
907a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák	case CHIP_POLARIS11:
908a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák	case CHIP_POLARIS12: /* same as polaris11 */
909a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák		return HAVE_LLVM >= 0x0309 ? "polaris11" : "carrizo";
910a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák	default:
911a8374c3d22d6ca110c6418373ee1e2e54ff918a1Marek Olšák		return "";
91265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	}
91365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák}
91465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
91565dc588bfd3b8145131340ffe77f216be58378acMarek Olšákstatic int r600_get_compute_param(struct pipe_screen *screen,
9161a5c8c24b5791efa02a7beefa4ba1c49ae033c73Bas Nieuwenhuizen        enum pipe_shader_ir ir_type,
91765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák        enum pipe_compute_cap param,
91865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák        void *ret)
91965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák{
92065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen *)screen;
92165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
92265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	//TODO: select these params by asic
92365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	switch (param) {
92465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_IR_TARGET: {
9258109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		const char *gpu;
926a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard		const char *triple;
927100796c15c3a1467d03abc424e6f1494da02f376Marek Olšák		if (rscreen->family <= CHIP_ARUBA) {
928a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard			triple = "r600--";
929a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard		} else {
93091ec6e5664979382f3cb18ba91edc4af99f93471Tom Stellard			if (HAVE_LLVM < 0x0400) {
93191ec6e5664979382f3cb18ba91edc4af99f93471Tom Stellard				triple = "amdgcn--";
93291ec6e5664979382f3cb18ba91edc4af99f93471Tom Stellard			} else {
93391ec6e5664979382f3cb18ba91edc4af99f93471Tom Stellard				triple = "amdgcn-mesa-mesa3d";
93491ec6e5664979382f3cb18ba91edc4af99f93471Tom Stellard			}
935a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard		}
9368109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		switch(rscreen->family) {
9378109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		/* Clang < 3.6 is missing Hainan in its list of
9388109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		 * GPUs, so we need to use the name of a similar GPU.
9398109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		 */
9408109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		default:
9418109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard			gpu = r600_get_llvm_processor_name(rscreen->family);
9428109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard			break;
9438109664dedee588dc98c9a7c25bd40c0eb56c35fTom Stellard		}
94465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
945a8ef880a1b38cbcfc26e9f829338739d16cece99Tom Stellard			sprintf(ret, "%s-%s", gpu, triple);
94665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
947ee31c8d7067ec5a563cdce5a12d8e077db0a7f67Michel Dänzer		/* +2 for dash and terminating NIL byte */
948ee31c8d7067ec5a563cdce5a12d8e077db0a7f67Michel Dänzer		return (strlen(triple) + strlen(gpu) + 2) * sizeof(char);
94965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	}
95065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_GRID_DIMENSION:
95165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
95265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *grid_dimension = ret;
95365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			grid_dimension[0] = 3;
95465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
95565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return 1 * sizeof(uint64_t);
95665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
95765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:
95865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
95965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *grid_size = ret;
96065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			grid_size[0] = 65535;
96165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			grid_size[1] = 65535;
962464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			grid_size[2] = 65535;
96365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
96465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return 3 * sizeof(uint64_t) ;
96565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
96665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:
96765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
96865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *block_size = ret;
969464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			if (rscreen->chip_class >= SI && HAVE_LLVM >= 0x309 &&
970464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			    ir_type == PIPE_SHADER_IR_TGSI) {
971464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				block_size[0] = 2048;
972464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				block_size[1] = 2048;
973464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				block_size[2] = 2048;
974464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			} else {
975464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				block_size[0] = 256;
976464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				block_size[1] = 256;
977464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				block_size[2] = 256;
978464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			}
97965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
98065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return 3 * sizeof(uint64_t);
98165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
98265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:
98365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
98465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_threads_per_block = ret;
985464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			if (rscreen->chip_class >= SI && HAVE_LLVM >= 0x309 &&
986464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			    ir_type == PIPE_SHADER_IR_TGSI)
987464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				*max_threads_per_block = 2048;
988464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen			else
989464cef5b06e65aa740704e4adac68b7f5fee1b88Bas Nieuwenhuizen				*max_threads_per_block = 256;
99065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
99165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
992c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely	case PIPE_COMPUTE_CAP_ADDRESS_BITS:
993c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely		if (ret) {
994c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely			uint32_t *address_bits = ret;
995c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely			address_bits[0] = 32;
996c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely			if (rscreen->chip_class >= SI)
997c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely				address_bits[0] = 64;
998c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely		}
999c7af84968d4ee0f67c46c347c6fb83d6fbc83ef3Jan Vesely		return 1 * sizeof(uint32_t);
100065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
100165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:
100265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
100365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_global_size = ret;
100477ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			uint64_t max_mem_alloc_size;
100577ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard
10061a5c8c24b5791efa02a7beefa4ba1c49ae033c73Bas Nieuwenhuizen			r600_get_compute_param(screen, ir_type,
100777ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard				PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
100877ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard				&max_mem_alloc_size);
100977ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard
101077ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			/* In OpenCL, the MAX_MEM_ALLOC_SIZE must be at least
101177ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * 1/4 of the MAX_GLOBAL_SIZE.  Since the
101277ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * MAX_MEM_ALLOC_SIZE is fixed for older kernels,
101377ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * make sure we never report more than
101477ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 * 4 * MAX_MEM_ALLOC_SIZE.
101577ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			 */
101677ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard			*max_global_size = MIN2(4 * max_mem_alloc_size,
10178a4ace4a47a07323997da5c2dbc865a32df52451Marek Olšák						MAX2(rscreen->info.gart_size,
10188a4ace4a47a07323997da5c2dbc865a32df52451Marek Olšák						     rscreen->info.vram_size));
101965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
102065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
102165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
102265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:
102365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
102465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_local_size = ret;
102565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			/* Value reported by the closed source driver. */
102665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			*max_local_size = 32768;
102765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
102865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
102965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
103065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE:
103165dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
103265dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_input_size = ret;
103365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			/* Value reported by the closed source driver. */
103465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			*max_input_size = 1024;
103565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
103665dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
103765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
103865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE:
103965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		if (ret) {
104065dc588bfd3b8145131340ffe77f216be58378acMarek Olšák			uint64_t *max_mem_alloc_size = ret;
104177ea58ca81eb3f5521d67c4459d3469df6d5ffd8Tom Stellard
10428a4ace4a47a07323997da5c2dbc865a32df52451Marek Olšák			*max_mem_alloc_size = rscreen->info.max_alloc_size;
104365dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		}
104465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák		return sizeof(uint64_t);
104565dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
10460a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard	case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:
10470a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard		if (ret) {
10480a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard			uint32_t *max_clock_frequency = ret;
10491e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák			*max_clock_frequency = rscreen->info.max_shader_clock;
10500a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard		}
10510a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard		return sizeof(uint32_t);
10520a41054b7faa9df4e4b8802f646a7e078389eb89Tom Stellard
105303aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez	case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:
105403aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez		if (ret) {
105503aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez			uint32_t *max_compute_units = ret;
10560d8e4f958f83e0b67f07030c661a30b4e7c19425Marek Olšák			*max_compute_units = rscreen->info.num_good_compute_units;
105703aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez		}
105803aab2af16778f3ab8130ec664fd6a6066ca869aBruno Jiménez		return sizeof(uint32_t);
10591607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard
10601607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard	case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:
10611607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard		if (ret) {
10621607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard			uint32_t *images_supported = ret;
10631607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard			*images_supported = 0;
10641607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard		}
10651607a8efc13aace755fe46eba8eb755cd93ea4e4Tom Stellard		return sizeof(uint32_t);
1066b77eaafcdc1b9f050d44d46608e542a9e593da3eMarek Olšák	case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:
1067b77eaafcdc1b9f050d44d46608e542a9e593da3eMarek Olšák		break; /* unused */
1068249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy	case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
1069249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy		if (ret) {
1070249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy			uint32_t *subgroup_size = ret;
1071249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy			*subgroup_size = r600_wavefront_size(rscreen->family);
1072249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy		}
1073249a9df7fce0a6bebc70852ab583c5324208bf06Grigori Goronzy		return sizeof(uint32_t);
107407bb4513c6e48f73df713f590fd8dd0710fad0c8Samuel Pitoiset	case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:
107577c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle		if (ret) {
107677c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle			uint64_t *max_variable_threads_per_block = ret;
107777c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle			if (rscreen->chip_class >= SI && HAVE_LLVM >= 0x309 &&
107877c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle			    ir_type == PIPE_SHADER_IR_TGSI)
107977c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle				*max_variable_threads_per_block = SI_MAX_VARIABLE_THREADS_PER_BLOCK;
108077c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle			else
108177c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle				*max_variable_threads_per_block = 0;
108277c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle		}
108377c81164bc1cd9ec98b32c40753f590791450434Nicolai Hähnle		return sizeof(uint64_t);
108465dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	}
1085d6fd8a97711eb065603a8d667ff5dbe68a246439Michel Dänzer
1086d6fd8a97711eb065603a8d667ff5dbe68a246439Michel Dänzer        fprintf(stderr, "unknown PIPE_COMPUTE_CAP %d\n", param);
1087d6fd8a97711eb065603a8d667ff5dbe68a246439Michel Dänzer        return 0;
108865dc588bfd3b8145131340ffe77f216be58378acMarek Olšák}
108965dc588bfd3b8145131340ffe77f216be58378acMarek Olšák
1090ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšákstatic uint64_t r600_get_timestamp(struct pipe_screen *screen)
1091ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák{
1092ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
1093ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák
1094ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák	return 1000000 * rscreen->ws->query_value(rscreen->ws, RADEON_TIMESTAMP) /
10951e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák			rscreen->info.clock_crystal_freq;
1096ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák}
1097ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák
10989807556e863ca4f49905598a18912852e96fae76Marek Olšákstatic void r600_fence_reference(struct pipe_screen *screen,
10993b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák				 struct pipe_fence_handle **dst,
11003b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák				 struct pipe_fence_handle *src)
11019807556e863ca4f49905598a18912852e96fae76Marek Olšák{
11023b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct radeon_winsys *ws = ((struct r600_common_screen*)screen)->ws;
11033b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct r600_multi_fence **rdst = (struct r600_multi_fence **)dst;
11043b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct r600_multi_fence *rsrc = (struct r600_multi_fence *)src;
11053b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
11063b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	if (pipe_reference(&(*rdst)->reference, &rsrc->reference)) {
11073b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		ws->fence_reference(&(*rdst)->gfx, NULL);
11083b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		ws->fence_reference(&(*rdst)->sdma, NULL);
11093b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		FREE(*rdst);
11103b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	}
11113b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák        *rdst = rsrc;
11129807556e863ca4f49905598a18912852e96fae76Marek Olšák}
11139807556e863ca4f49905598a18912852e96fae76Marek Olšák
11149807556e863ca4f49905598a18912852e96fae76Marek Olšákstatic boolean r600_fence_finish(struct pipe_screen *screen,
111554272e18a682c8b82d4a86b2c07b51c303d8ceadMarek Olšák				 struct pipe_context *ctx,
11169807556e863ca4f49905598a18912852e96fae76Marek Olšák				 struct pipe_fence_handle *fence,
11179807556e863ca4f49905598a18912852e96fae76Marek Olšák				 uint64_t timeout)
11189807556e863ca4f49905598a18912852e96fae76Marek Olšák{
11199807556e863ca4f49905598a18912852e96fae76Marek Olšák	struct radeon_winsys *rws = ((struct r600_common_screen*)screen)->ws;
11203b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	struct r600_multi_fence *rfence = (struct r600_multi_fence *)fence;
11213f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	struct r600_common_context *rctx =
11223f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		ctx ? (struct r600_common_context*)ctx : NULL;
11233b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	int64_t abs_timeout = os_time_get_absolute_timeout(timeout);
11243b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
11253b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	if (rfence->sdma) {
11263b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		if (!rws->fence_wait(rws, rfence->sdma, timeout))
11273b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			return false;
11283b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
11293b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		/* Recompute the timeout after waiting. */
11303b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		if (timeout && timeout != PIPE_TIMEOUT_INFINITE) {
11313b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			int64_t time = os_time_get_nano();
11323b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák			timeout = abs_timeout > time ? abs_timeout - time : 0;
11333b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		}
11343b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	}
11353b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák
11363b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	if (!rfence->gfx)
11373b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák		return true;
11389807556e863ca4f49905598a18912852e96fae76Marek Olšák
11393f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	/* Flush the gfx IB if it hasn't been flushed yet. */
11403f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	if (rctx &&
11413f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	    rfence->gfx_unflushed.ctx == rctx &&
11423f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	    rfence->gfx_unflushed.ib_index == rctx->num_gfx_cs_flushes) {
11433f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		rctx->gfx.flush(rctx, timeout ? 0 : RADEON_FLUSH_ASYNC, NULL);
11443f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		rfence->gfx_unflushed.ctx = NULL;
11453f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák
11463f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		if (!timeout)
11473f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák			return false;
11483f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák
11493f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		/* Recompute the timeout after all that. */
11503f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		if (timeout && timeout != PIPE_TIMEOUT_INFINITE) {
11513f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák			int64_t time = os_time_get_nano();
11523f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák			timeout = abs_timeout > time ? abs_timeout - time : 0;
11533f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák		}
11543f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák	}
11553f100b77f9a80828fbb3651ea013f9dd3913d047Marek Olšák
11563b37155a68acc351cba86a1fa142bd0de2192d4cMarek Olšák	return rws->fence_wait(rws, rfence->gfx, timeout);
11579807556e863ca4f49905598a18912852e96fae76Marek Olšák}
11589807556e863ca4f49905598a18912852e96fae76Marek Olšák
1159635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšákstatic void r600_query_memory_info(struct pipe_screen *screen,
1160635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák				   struct pipe_memory_info *info)
1161635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák{
1162635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
1163635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	struct radeon_winsys *ws = rscreen->ws;
1164635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	unsigned vram_usage, gtt_usage;
1165635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák
1166635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	info->total_device_memory = rscreen->info.vram_size / 1024;
1167635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	info->total_staging_memory = rscreen->info.gart_size / 1024;
1168635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák
1169635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	/* The real TTM memory usage is somewhat random, because:
1170635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 *
1171635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 * 1) TTM delays freeing memory, because it can only free it after
1172635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 *    fences expire.
1173635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 *
1174635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 * 2) The memory usage can be really low if big VRAM evictions are
1175635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 *    taking place, but the real usage is well above the size of VRAM.
1176635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 *
1177635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 * Instead, return statistics of this process.
1178635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	 */
1179635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	vram_usage = ws->query_value(ws, RADEON_REQUESTED_VRAM_MEMORY) / 1024;
1180635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	gtt_usage =  ws->query_value(ws, RADEON_REQUESTED_GTT_MEMORY) / 1024;
1181635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák
1182635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	info->avail_device_memory =
1183635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák		vram_usage <= info->total_device_memory ?
1184635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák				info->total_device_memory - vram_usage : 0;
1185635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	info->avail_staging_memory =
1186635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák		gtt_usage <= info->total_staging_memory ?
1187635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák				info->total_staging_memory - gtt_usage : 0;
1188635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák
1189635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	info->device_memory_evicted =
1190635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák		ws->query_value(ws, RADEON_NUM_BYTES_MOVED) / 1024;
11911c13c71ef8eafde8cc3c3baa0b2fa96c6cf19d6cMarek Olšák
11921c13c71ef8eafde8cc3c3baa0b2fa96c6cf19d6cMarek Olšák	if (rscreen->info.drm_major == 3 && rscreen->info.drm_minor >= 4)
11931c13c71ef8eafde8cc3c3baa0b2fa96c6cf19d6cMarek Olšák		info->nr_device_memory_evictions =
11941c13c71ef8eafde8cc3c3baa0b2fa96c6cf19d6cMarek Olšák			ws->query_value(ws, RADEON_NUM_EVICTIONS);
11951c13c71ef8eafde8cc3c3baa0b2fa96c6cf19d6cMarek Olšák	else
11961c13c71ef8eafde8cc3c3baa0b2fa96c6cf19d6cMarek Olšák		/* Just return the number of evicted 64KB pages. */
11971c13c71ef8eafde8cc3c3baa0b2fa96c6cf19d6cMarek Olšák		info->nr_device_memory_evictions = info->device_memory_evicted / 64;
1198635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák}
1199635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák
1200a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšákstruct pipe_resource *r600_resource_create_common(struct pipe_screen *screen,
1201a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák						  const struct pipe_resource *templ)
1202a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák{
1203a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	if (templ->target == PIPE_BUFFER) {
1204a6c38d47d422f66e4ba17f15144f68c574080b17Nicolai Hähnle		return r600_buffer_create(screen, templ, 256);
1205a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	} else {
1206a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák		return r600_texture_create(screen, templ);
1207a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	}
1208a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák}
1209a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák
12101bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšákbool r600_common_screen_init(struct r600_common_screen *rscreen,
1211d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák			     struct radeon_winsys *ws)
1212d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák{
12138539c9bf3158416b22346dc49696872e631e969fMarek Olšák	char llvm_string[32] = {}, kernel_version[128] = {};
12148539c9bf3158416b22346dc49696872e631e969fMarek Olšák	struct utsname uname_data;
1215a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
1216d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	ws->query_info(ws, &rscreen->info);
1217d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
12188539c9bf3158416b22346dc49696872e631e969fMarek Olšák	if (uname(&uname_data) == 0)
12198539c9bf3158416b22346dc49696872e631e969fMarek Olšák		snprintf(kernel_version, sizeof(kernel_version),
12208539c9bf3158416b22346dc49696872e631e969fMarek Olšák			 " / %s", uname_data.release);
12218539c9bf3158416b22346dc49696872e631e969fMarek Olšák
122242920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák	if (HAVE_LLVM > 0) {
122342920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák		snprintf(llvm_string, sizeof(llvm_string),
122442920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák			 ", LLVM %i.%i.%i", (HAVE_LLVM >> 8) & 0xff,
122542920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák			 HAVE_LLVM & 0xff, MESA_LLVM_VERSION_PATCH);
122642920c0fb98eee586000eee3b122c57d8374e42fMarek Olšák	}
1227a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
1228a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák	snprintf(rscreen->renderer_string, sizeof(rscreen->renderer_string),
12298539c9bf3158416b22346dc49696872e631e969fMarek Olšák		 "%s (DRM %i.%i.%i%s%s)",
1230a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák		 r600_get_chip_name(rscreen), rscreen->info.drm_major,
1231a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák		 rscreen->info.drm_minor, rscreen->info.drm_patchlevel,
12328539c9bf3158416b22346dc49696872e631e969fMarek Olšák		 kernel_version, llvm_string);
1233a3723fb9e32ab114dcffcf74946def92647c5f03Marek Olšák
12344df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	rscreen->b.get_name = r600_get_name;
12354df3f25fa2c0bcf38be4a4fdcbb37428e4af10bdMarek Olšák	rscreen->b.get_vendor = r600_get_vendor;
123676039b38f0ef54ca61cbe72b899dfcf0f0c724e4Giuseppe Bilotta	rscreen->b.get_device_vendor = r600_get_device_vendor;
123765dc588bfd3b8145131340ffe77f216be58378acMarek Olšák	rscreen->b.get_compute_param = r600_get_compute_param;
1238d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	rscreen->b.get_paramf = r600_get_paramf;
1239ba0c16f7b2283db9dbeef036cf54dd6b694e4eaaMarek Olšák	rscreen->b.get_timestamp = r600_get_timestamp;
12409807556e863ca4f49905598a18912852e96fae76Marek Olšák	rscreen->b.fence_finish = r600_fence_finish;
12419807556e863ca4f49905598a18912852e96fae76Marek Olšák	rscreen->b.fence_reference = r600_fence_reference;
1242a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák	rscreen->b.resource_destroy = u_resource_destroy_vtbl;
12437713d594e4fbb9afb1ac67417b7871d436590548Marek Olšák	rscreen->b.resource_from_user_memory = r600_buffer_from_user_memory;
1244635555af6a223d6d05d0af247ca2b7cd80828e91Marek Olšák	rscreen->b.query_memory_info = r600_query_memory_info;
1245a9ae7635b77fc4fd9f4614fead63fefa6ff74f4eMarek Olšák
1246d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	if (rscreen->info.has_uvd) {
12477bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König		rscreen->b.get_video_param = rvid_get_video_param;
12487bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König		rscreen->b.is_video_format_supported = rvid_is_format_supported;
1249d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	} else {
1250d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		rscreen->b.get_video_param = r600_get_video_param;
1251d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák		rscreen->b.is_video_format_supported = vl_video_buffer_is_format_supported;
1252d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák	}
1253d41bd71bcfa43b3aad5abbb0da9f716e631042c4Marek Olšák
12549855477e903e00f7457adb15594048416444b992Marek Olšák	r600_init_screen_texture_functions(rscreen);
1255e117e74baf0e0482fd4c3c2fa412e7168889d286Nicolai Hähnle	r600_init_screen_query_functions(rscreen);
12569807556e863ca4f49905598a18912852e96fae76Marek Olšák
1257d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	rscreen->ws = ws;
1258d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	rscreen->family = rscreen->info.family;
1259d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák	rscreen->chip_class = rscreen->info.chip_class;
1260ba650ccf91a103d90d45b5927a8a9220e222cfc5Marek Olšák	rscreen->debug_flags = debug_get_flags_option("R600_DEBUG", common_debug_options, 0);
126168f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
1262e56e1f8119f28eebbe6fbe7040c80a6dd884f5fdNicolai Hähnle	slab_create_parent(&rscreen->pool_transfers, sizeof(struct r600_transfer), 64);
1263e56e1f8119f28eebbe6fbe7040c80a6dd884f5fdNicolai Hähnle
126404f15e491f8ecd0bce59e2de5e501ed3fd157c62Marek Olšák	rscreen->force_aniso = MIN2(16, debug_get_num_option("R600_TEX_ANISO", -1));
126504f15e491f8ecd0bce59e2de5e501ed3fd157c62Marek Olšák	if (rscreen->force_aniso >= 0) {
126604f15e491f8ecd0bce59e2de5e501ed3fd157c62Marek Olšák		printf("radeon: Forcing anisotropy filter to %ix\n",
126704f15e491f8ecd0bce59e2de5e501ed3fd157c62Marek Olšák		       /* round down to a power of two */
126804f15e491f8ecd0bce59e2de5e501ed3fd157c62Marek Olšák		       1 << util_logbase2(rscreen->force_aniso));
126904f15e491f8ecd0bce59e2de5e501ed3fd157c62Marek Olšák	}
127004f15e491f8ecd0bce59e2de5e501ed3fd157c62Marek Olšák
12711bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	util_format_s3tc_init();
127268f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_init(rscreen->aux_context_lock);
12736d05396b0047c74d740c53156eda1a8574403498Marek Olšák	pipe_mutex_init(rscreen->gpu_load_mutex);
1274ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák
1275d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák	if (rscreen->debug_flags & DBG_INFO) {
1276d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("pci_id = 0x%x\n", rscreen->info.pci_id);
12771e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("family = %i (%s)\n", rscreen->info.family,
12781e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		       r600_get_chip_name(rscreen));
1279d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("chip_class = %i\n", rscreen->info.chip_class);
12801e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("gart_size = %i MB\n", (int)DIV_ROUND_UP(rscreen->info.gart_size, 1024*1024));
12811e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("vram_size = %i MB\n", (int)DIV_ROUND_UP(rscreen->info.vram_size, 1024*1024));
12828a4ace4a47a07323997da5c2dbc865a32df52451Marek Olšák		printf("max_alloc_size = %i MB\n",
12838a4ace4a47a07323997da5c2dbc865a32df52451Marek Olšák		       (int)DIV_ROUND_UP(rscreen->info.max_alloc_size, 1024*1024));
12841e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("has_virtual_memory = %i\n", rscreen->info.has_virtual_memory);
12851e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("gfx_ib_pad_with_type2 = %i\n", rscreen->info.gfx_ib_pad_with_type2);
12861e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("has_sdma = %i\n", rscreen->info.has_sdma);
12871e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("has_uvd = %i\n", rscreen->info.has_uvd);
1288e0736c438c15f1793630424d29ef63868f12a172Nicolai Hähnle		printf("me_fw_version = %i\n", rscreen->info.me_fw_version);
1289e0736c438c15f1793630424d29ef63868f12a172Nicolai Hähnle		printf("pfp_fw_version = %i\n", rscreen->info.pfp_fw_version);
1290e0736c438c15f1793630424d29ef63868f12a172Nicolai Hähnle		printf("ce_fw_version = %i\n", rscreen->info.ce_fw_version);
12911e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("vce_fw_version = %i\n", rscreen->info.vce_fw_version);
12921e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("vce_harvest_config = %i\n", rscreen->info.vce_harvest_config);
12931e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("clock_crystal_freq = %i\n", rscreen->info.clock_crystal_freq);
12941e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("drm = %i.%i.%i\n", rscreen->info.drm_major,
12951e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		       rscreen->info.drm_minor, rscreen->info.drm_patchlevel);
12961e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("has_userptr = %i\n", rscreen->info.has_userptr);
12971e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák
12981e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("r600_max_quad_pipes = %i\n", rscreen->info.r600_max_quad_pipes);
12991e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("max_shader_clock = %i\n", rscreen->info.max_shader_clock);
13000d8e4f958f83e0b67f07030c661a30b4e7c19425Marek Olšák		printf("num_good_compute_units = %i\n", rscreen->info.num_good_compute_units);
1301d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("max_se = %i\n", rscreen->info.max_se);
1302d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák		printf("max_sh_per_se = %i\n", rscreen->info.max_sh_per_se);
13031e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák
13041e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("r600_gb_backend_map = %i\n", rscreen->info.r600_gb_backend_map);
13051e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("r600_gb_backend_map_valid = %i\n", rscreen->info.r600_gb_backend_map_valid);
1306276621da451ae93321de05bf63baaf20ee2f32caMarek Olšák		printf("r600_num_banks = %i\n", rscreen->info.r600_num_banks);
13071e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("num_render_backends = %i\n", rscreen->info.num_render_backends);
13081e864d73799cfbcb29c4f22722b908bc39643347Marek Olšák		printf("num_tile_pipes = %i\n", rscreen->info.num_tile_pipes);
13094f96846d9d96fcb84fb0fb1823b3f59c3c426253Marek Olšák		printf("pipe_interleave_bytes = %i\n", rscreen->info.pipe_interleave_bytes);
1310d8269be1ceed29d2e00829e1fd4a7bbac389d967Marek Olšák	}
13111bb77f81db0ed3d1b3dd14c055ff7a9679399bb1Marek Olšák	return true;
131268f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák}
131368f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
1314ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšákvoid r600_destroy_common_screen(struct r600_common_screen *rscreen)
131568f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák{
1316ad22006892c5511dac7d0d680633a1b857da49fbNicolai Hähnle	r600_perfcounters_destroy(rscreen);
13176d05396b0047c74d740c53156eda1a8574403498Marek Olšák	r600_gpu_load_kill_thread(rscreen);
13186d05396b0047c74d740c53156eda1a8574403498Marek Olšák
13196d05396b0047c74d740c53156eda1a8574403498Marek Olšák	pipe_mutex_destroy(rscreen->gpu_load_mutex);
132068f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_destroy(rscreen->aux_context_lock);
132168f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	rscreen->aux_context->destroy(rscreen->aux_context);
1322ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák
1323e56e1f8119f28eebbe6fbe7040c80a6dd884f5fdNicolai Hähnle	slab_destroy_parent(&rscreen->pool_transfers);
1324e56e1f8119f28eebbe6fbe7040c80a6dd884f5fdNicolai Hähnle
1325ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák	rscreen->ws->destroy(rscreen->ws);
1326ed42e95404a51298ea878a0d1cdcbc473612706aMarek Olšák	FREE(rscreen);
1327d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák}
1328d5b23dfc1c07f98afe749053b9cb4b69829fe3d4Marek Olšák
13290cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšákbool r600_can_dump_shader(struct r600_common_screen *rscreen,
1330cd7f252b114b7771cde9bba698eddaa1b4b93ab4Marek Olšák			  unsigned processor)
13310cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák{
1332cd7f252b114b7771cde9bba698eddaa1b4b93ab4Marek Olšák	switch (processor) {
1333af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák	case PIPE_SHADER_VERTEX:
13340cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_VS) != 0;
1335af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák	case PIPE_SHADER_TESS_CTRL:
1336c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák		return (rscreen->debug_flags & DBG_TCS) != 0;
1337af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák	case PIPE_SHADER_TESS_EVAL:
1338c2670463fd50f5b74066f0e0ab8f9a31dcb37429Marek Olšák		return (rscreen->debug_flags & DBG_TES) != 0;
1339af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák	case PIPE_SHADER_GEOMETRY:
13400cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_GS) != 0;
1341af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák	case PIPE_SHADER_FRAGMENT:
13420cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_PS) != 0;
1343af249a7da9bf2621ab836d5074ef692677b11bbfMarek Olšák	case PIPE_SHADER_COMPUTE:
13440cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return (rscreen->debug_flags & DBG_CS) != 0;
13450cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	default:
13460cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák		return false;
13470cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák	}
13480cb9de1dd078395d541c32c0de81ea4f05147baaMarek Olšák}
134968f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
13508b1f9fd3b3e4b7703314278061d7905a6e780ce7Nicolai Hähnlebool r600_extra_shader_checks(struct r600_common_screen *rscreen, unsigned processor)
13518b1f9fd3b3e4b7703314278061d7905a6e780ce7Nicolai Hähnle{
13528b1f9fd3b3e4b7703314278061d7905a6e780ce7Nicolai Hähnle	return (rscreen->debug_flags & DBG_CHECK_IR) ||
13538b1f9fd3b3e4b7703314278061d7905a6e780ce7Nicolai Hähnle	       r600_can_dump_shader(rscreen, processor);
13548b1f9fd3b3e4b7703314278061d7905a6e780ce7Nicolai Hähnle}
13558b1f9fd3b3e4b7703314278061d7905a6e780ce7Nicolai Hähnle
135668f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšákvoid r600_screen_clear_buffer(struct r600_common_screen *rscreen, struct pipe_resource *dst,
13579a3296bf1cf8d45349b14b31eeb0d81f8b8774fcMarek Olšák			      uint64_t offset, uint64_t size, unsigned value)
135868f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák{
135968f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	struct r600_common_context *rctx = (struct r600_common_context*)rscreen->aux_context;
136068f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák
136168f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_lock(rscreen->aux_context_lock);
13629a3296bf1cf8d45349b14b31eeb0d81f8b8774fcMarek Olšák	rctx->dma_clear_buffer(&rctx->b, dst, offset, size, value);
136368f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	rscreen->aux_context->flush(rscreen->aux_context, NULL, 0);
136468f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák	pipe_mutex_unlock(rscreen->aux_context_lock);
136568f6dec32ed5eede361f76c8dbdf897652659bafMarek Olšák}
1366