1a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/*
2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard *
4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * Permission is hereby granted, free of charge, to any person obtaining a
5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * copy of this software and associated documentation files (the "Software"),
6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * to deal in the Software without restriction, including without limitation
7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * on the rights to use, copy, modify, merge, publish, distribute, sub
8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * license, and/or sell copies of the Software, and to permit persons to whom
9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * the Software is furnished to do so, subject to the following conditions:
10a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard *
11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * The above copyright notice and this permission notice (including the next
12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * paragraph) shall be included in all copies or substantial portions of the
13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * Software.
14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard *
15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * USE OR OTHER DEALINGS IN THE SOFTWARE.
22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard */
23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include <stdio.h>
24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include <errno.h>
25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "pipe/p_defines.h"
26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "pipe/p_state.h"
27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "pipe/p_context.h"
28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "tgsi/tgsi_scan.h"
29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "tgsi/tgsi_parse.h"
30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "tgsi/tgsi_util.h"
31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_blitter.h"
32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_double_list.h"
33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_format.h"
34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_format_s3tc.h"
35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_transfer.h"
36a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_surface.h"
37a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_pack_color.h"
38a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_memory.h"
39a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_inlines.h"
4082cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer#include "util/u_simple_shaders.h"
41a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "util/u_upload_mgr.h"
42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "vl/vl_decoder.h"
43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "vl/vl_video_buffer.h"
44a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "os/os_time.h"
45a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "pipebuffer/pb_buffer.h"
46a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "r600.h"
47a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "sid.h"
48a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "r600_resource.h"
49a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "radeonsi_pipe.h"
50a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "r600_hw_context_priv.h"
51840f05da6b92ba5266385836533842b9a9fc5da9Christian König#include "si_state.h"
52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
53a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/*
54a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * pipe_context
55a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard */
56a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic struct r600_fence *r600_create_fence(struct r600_context *rctx)
57a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
58a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = rctx->screen;
59a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_fence *fence = NULL;
60a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
61a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	pipe_mutex_lock(rscreen->fences.mutex);
62a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
63a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (!rscreen->fences.bo) {
64a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* Create the shared buffer object */
65fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König		rscreen->fences.bo = si_resource_create_custom(&rscreen->screen,
66fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König							       PIPE_USAGE_STAGING,
67fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König							       4096);
68a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if (!rscreen->fences.bo) {
69a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			R600_ERR("r600: failed to create bo for fence objects\n");
70a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			goto out;
71a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
720a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák		rscreen->fences.data = rctx->ws->buffer_map(rscreen->fences.bo->cs_buf,
73a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard							   rctx->cs,
74a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard							   PIPE_TRANSFER_READ_WRITE);
75a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
76a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
77a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (!LIST_IS_EMPTY(&rscreen->fences.pool)) {
78a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		struct r600_fence *entry;
79a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
80a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* Try to find a freed fence that has been signalled */
81a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		LIST_FOR_EACH_ENTRY(entry, &rscreen->fences.pool, head) {
82a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			if (rscreen->fences.data[entry->index] != 0) {
83a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard				LIST_DELINIT(&entry->head);
84a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard				fence = entry;
85a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard				break;
86a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			}
87a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
88a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
89a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
90a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (!fence) {
91a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* Allocate a new fence */
92a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		struct r600_fence_block *block;
93a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		unsigned index;
94a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
95a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if ((rscreen->fences.next_index + 1) >= 1024) {
96a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			R600_ERR("r600: too many concurrent fences\n");
97a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			goto out;
98a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
99a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
100a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		index = rscreen->fences.next_index++;
101a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
102a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if (!(index % FENCE_BLOCK_SIZE)) {
103a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			/* Allocate a new block */
104a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			block = CALLOC_STRUCT(r600_fence_block);
105a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			if (block == NULL)
106a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard				goto out;
107a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
108a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			LIST_ADD(&block->head, &rscreen->fences.blocks);
109a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		} else {
110a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			block = LIST_ENTRY(struct r600_fence_block, rscreen->fences.blocks.next, head);
111a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
112a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
113a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		fence = &block->fences[index % FENCE_BLOCK_SIZE];
114a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		fence->index = index;
115a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
116a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
117a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	pipe_reference_init(&fence->reference, 1);
118a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->fences.data[fence->index] = 0;
1201b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer	si_context_emit_fence(rctx, rscreen->fences.bo, fence->index, 1);
121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Create a dummy BO so that fence_finish without a timeout can sleep waiting for completion */
123fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	fence->sleep_bo = si_resource_create_custom(&rctx->screen->screen, PIPE_USAGE_STAGING, 1);
124fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König
125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Add the fence as a dummy relocation. */
126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	r600_context_bo_reloc(rctx, fence->sleep_bo, RADEON_USAGE_READWRITE);
127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
128a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardout:
129a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	pipe_mutex_unlock(rscreen->fences.mutex);
130a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return fence;
131a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
132a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
133a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
134a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardvoid radeonsi_flush(struct pipe_context *ctx, struct pipe_fence_handle **fence,
135a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		    unsigned flags)
136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_context *rctx = (struct r600_context *)ctx;
138a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_fence **rfence = (struct r600_fence**)fence;
139a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct pipe_query *render_cond = NULL;
140a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	unsigned render_cond_mode = 0;
141a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
142a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rfence)
143a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		*rfence = r600_create_fence(rctx);
144a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
145a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Disable render condition. */
146a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rctx->current_render_cond) {
147a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		render_cond = rctx->current_render_cond;
148a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		render_cond_mode = rctx->current_render_cond_mode;
149a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		ctx->render_condition(ctx, NULL, 0);
150a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
151a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1521b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer	si_context_flush(rctx, flags);
153a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
154a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Re-enable render condition. */
155a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (render_cond) {
156a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		ctx->render_condition(ctx, render_cond, render_cond_mode);
157a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
158a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
159a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
160a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic void r600_flush_from_st(struct pipe_context *ctx,
161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			       struct pipe_fence_handle **fence)
162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
163a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	radeonsi_flush(ctx, fence, 0);
164a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
165a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
166a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic void r600_flush_from_winsys(void *ctx, unsigned flags)
167a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
168a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	radeonsi_flush((struct pipe_context*)ctx, NULL, flags);
169a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
170a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
171a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic void r600_destroy_context(struct pipe_context *context)
172a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
173a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_context *rctx = (struct r600_context *)context;
174a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
17582cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer	if (rctx->dummy_pixel_shader) {
17682cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer		rctx->context.delete_fs_state(&rctx->context, rctx->dummy_pixel_shader);
17782cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer	}
178a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->context.delete_depth_stencil_alpha_state(&rctx->context, rctx->custom_dsa_flush);
179a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	util_unreference_framebuffer_state(&rctx->framebuffer);
180a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
181a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	util_blitter_destroy(rctx->blitter);
182a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1832a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák	if (rctx->uploader) {
1842a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák		u_upload_destroy(rctx->uploader);
1852a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák	}
186a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	util_slab_destroy(&rctx->pool_transfers);
187a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	FREE(rctx);
188a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
189a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
190a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic struct pipe_context *r600_create_context(struct pipe_screen *screen, void *priv)
191a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
192a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_context *rctx = CALLOC_STRUCT(r600_context);
193a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen* rscreen = (struct r600_screen *)screen;
194a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
195a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rctx == NULL)
196a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
197a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
198a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->context.screen = screen;
199a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->context.priv = priv;
200a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->context.destroy = r600_destroy_context;
201a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->context.flush = r600_flush_from_st;
202a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
203a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Easy accessing of screen/winsys. */
204a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->screen = rscreen;
205a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->ws = rscreen->ws;
206a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->family = rscreen->family;
207a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->chip_class = rscreen->chip_class;
208a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
2091b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer	si_init_blit_functions(rctx);
210a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	r600_init_query_functions(rctx);
211a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	r600_init_context_resource_functions(rctx);
2121b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer	si_init_surface_functions(rctx);
213a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
214a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->context.create_video_decoder = vl_create_decoder;
215a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->context.create_video_buffer = vl_video_buffer_create;
216a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
217a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch (rctx->chip_class) {
218a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case TAHITI:
2199b213c871a080472660eff271c72a3fcc5d3f578Christian König		si_init_state_functions(rctx);
220a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if (si_context_init(rctx)) {
221a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			r600_destroy_context(&rctx->context);
222a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			return NULL;
223a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
224a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		si_init_config(rctx);
225a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
226a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default:
227a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		R600_ERR("Unsupported chip class %d.\n", rctx->chip_class);
228a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		r600_destroy_context(&rctx->context);
229a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
230a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
231a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
232a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->ws->cs_set_flush_callback(rctx->cs, r600_flush_from_winsys, rctx);
233a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
234a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	util_slab_create(&rctx->pool_transfers,
235a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			 sizeof(struct pipe_transfer), 64,
236a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			 UTIL_SLAB_SINGLETHREADED);
237a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
2382a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák        rctx->uploader = u_upload_create(&rctx->context, 1024 * 1024, 256,
2392a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák                                         PIPE_BIND_INDEX_BUFFER |
2402a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák                                         PIPE_BIND_CONSTANT_BUFFER);
2412a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák        if (!rctx->uploader) {
242a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		r600_destroy_context(&rctx->context);
243a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
244a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
245a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
246a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rctx->blitter = util_blitter_create(&rctx->context);
247a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rctx->blitter == NULL) {
248a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		r600_destroy_context(&rctx->context);
249a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
250a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
251a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
2521b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer	si_get_backend_mask(rctx); /* this emits commands and must be last */
253a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
25482cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer	rctx->dummy_pixel_shader =
25582cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer		util_make_fragment_cloneinput_shader(&rctx->context, 0,
25682cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer						     TGSI_SEMANTIC_GENERIC,
25782cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer						     TGSI_INTERPOLATE_CONSTANT);
25882cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer	rctx->context.bind_fs_state(&rctx->context, rctx->dummy_pixel_shader);
25982cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer
260a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return &rctx->context;
261a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
262a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
263a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/*
264a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard * pipe_screen
265a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard */
266a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic const char* r600_get_vendor(struct pipe_screen* pscreen)
267a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
268a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return "X.Org";
269a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
270a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
271a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic const char *r600_get_family_name(enum radeon_family family)
272a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
273a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch(family) {
274de52a56a0ecb6a36badaf91381d638c31cbd3165Michel Dänzer	case CHIP_TAHITI: return "AMD TAHITI";
275de52a56a0ecb6a36badaf91381d638c31cbd3165Michel Dänzer	case CHIP_PITCAIRN: return "AMD PITCAIRN";
276de52a56a0ecb6a36badaf91381d638c31cbd3165Michel Dänzer	case CHIP_VERDE: return "AMD CAPE VERDE";
277a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default: return "AMD unknown";
278a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
279a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
280a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
281a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic const char* r600_get_name(struct pipe_screen* pscreen)
282a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
283a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
284a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
285a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return r600_get_family_name(rscreen->family);
286a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
287a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
288a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
289a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
290a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
291a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	enum radeon_family family = rscreen->family;
292a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
293a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch (param) {
294a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Supported features (boolean caps). */
295a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_NPOT_TEXTURES:
296a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TWO_SIDED_STENCIL:
29769a921892d2303f1400576aa73980c28880f8654Tom Stellard	case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
298a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_ANISOTROPIC_FILTER:
299a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_POINT_SPRITE:
300a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_OCCLUSION_QUERY:
301a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TEXTURE_SHADOW_MAP:
302a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
303a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_BLEND_EQUATION_SEPARATE:
304a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TEXTURE_SWIZZLE:
305a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
306a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_DEPTH_CLIP_DISABLE:
307a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_SHADER_STENCIL_EXPORT:
308a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
309a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
310a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
311a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
312a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_SM3:
313a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_SEAMLESS_CUBE_MAP:
314a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_PRIMITIVE_RESTART:
315a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_CONDITIONAL_RENDER:
316a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TEXTURE_BARRIER:
317a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_INDEP_BLEND_ENABLE:
318a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_INDEP_BLEND_FUNC:
319a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
320a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
3212a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák	case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
3222a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák	case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
3232a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák	case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
324437ab1d6df7282770ee869180446db36c2dbdfa8Marek Olšák	case PIPE_CAP_USER_INDEX_BUFFERS:
325437ab1d6df7282770ee869180446db36c2dbdfa8Marek Olšák	case PIPE_CAP_USER_CONSTANT_BUFFERS:
326af372129e5c1722a3d53dd1fc2f3409207c12f7eFredrik Höglund	case PIPE_CAP_START_INSTANCE:
327a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 1;
328a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
3291b749dc34f8d83cf3dfa863279b1fe2b356d34b2Marek Olšák	case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
3301b749dc34f8d83cf3dfa863279b1fe2b356d34b2Marek Olšák		return 256;
3311b749dc34f8d83cf3dfa863279b1fe2b356d34b2Marek Olšák
332a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_GLSL_FEATURE_LEVEL:
333a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return debug_get_bool_option("R600_GLSL130", FALSE) ? 130 : 120;
334a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
335a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Unsupported features. */
336a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TGSI_INSTANCEID:
337a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
338a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
339a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_SCALED_RESOLVE:
340a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS:
341a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
342a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
343a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_VERTEX_COLOR_CLAMPED:
344a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
3452a311b18fce9ea6538b0997ad23d86a061fb273cMarek Olšák	case PIPE_CAP_USER_VERTEX_BUFFERS:
346a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0;
347a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
348a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Stream output. */
349303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
350a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
351a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return debug_get_bool_option("R600_STREAMOUT", FALSE) ? 4 : 0;
352a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
353a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return debug_get_bool_option("R600_STREAMOUT", FALSE) ? 1 : 0;
354a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
355a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
356a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 16*4;
357303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
358303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
359303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
360303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
361303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König	case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
362303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König		return 0;
363a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
364a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Texturing. */
365a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
366a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
367a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
368a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			return 15;
369a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
370a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return rscreen->info.drm_minor >= 9 ? 16384 : 0;
371a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_COMBINED_SAMPLERS:
372a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 32;
373a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
374a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Render targets. */
375a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_RENDER_TARGETS:
376a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* FIXME some r6xx are buggy and can only do 4 */
377a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 8;
378a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
379a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* Timer queries, present when the clock frequency is non zero. */
380a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_TIMER_QUERY:
381a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return rscreen->info.r600_clock_crystal_freq != 0;
382a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
383a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MIN_TEXEL_OFFSET:
384a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return -8;
385a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
386a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAP_MAX_TEXEL_OFFSET:
387a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 7;
388a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
389a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return 0;
390a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
391a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
392a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic float r600_get_paramf(struct pipe_screen* pscreen,
393a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			     enum pipe_capf param)
394a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
395a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
396a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	enum radeon_family family = rscreen->family;
397a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
398a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch (param) {
399a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_MAX_LINE_WIDTH:
400a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_MAX_LINE_WIDTH_AA:
401a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_MAX_POINT_WIDTH:
402a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_MAX_POINT_WIDTH_AA:
403a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 16384.0f;
404a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
405a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 16.0f;
406a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
407a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 16.0f;
408a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_GUARD_BAND_LEFT:
409a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_GUARD_BAND_TOP:
410a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_GUARD_BAND_RIGHT:
411a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_CAPF_GUARD_BAND_BOTTOM:
412a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0.0f;
413a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
414a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return 0.0f;
415a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
416a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
417a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic int r600_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enum pipe_shader_cap param)
418a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
419a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
420a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch(shader)
421a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	{
422a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_FRAGMENT:
423a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_VERTEX:
424a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
425a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_GEOMETRY:
426a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* TODO: support and enable geometry programs */
427a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0;
428a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default:
429a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* TODO: support tessellation */
430a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0;
431a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
432a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
433a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* TODO: all these should be fixed, since r600 surely supports much more! */
434a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch (param) {
435a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
436a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
437a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
438a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
439a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 16384;
440a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
441a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 8; /* FIXME */
442a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_INPUTS:
443a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if(shader == PIPE_SHADER_FRAGMENT)
444a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			return 34;
445a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		else
446a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			return 32;
447a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_TEMPS:
448a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 256; /* Max native temporaries. */
449a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_ADDRS:
450a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* FIXME Isn't this equal to TEMPS? */
451a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 1; /* Max native address registers */
452a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_CONSTS:
453a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return R600_MAX_CONST_BUFFER_SIZE;
454a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
455a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return R600_MAX_CONST_BUFFERS;
456a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_PREDS:
457a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0; /* FIXME */
458a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
459a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 1;
460a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
461a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
462a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
463a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
464a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0;
465ae9be358f2d1e177648fb1803f152ff0b0bb9893Tom Stellard	case PIPE_SHADER_CAP_INTEGERS:
466ae9be358f2d1e177648fb1803f152ff0b0bb9893Tom Stellard		return 1;
467a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_SUBROUTINES:
468a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0;
469a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
470a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 16;
471a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
472a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return 0;
473a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
474a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
475a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic int r600_get_video_param(struct pipe_screen *screen,
476a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard				enum pipe_video_profile profile,
477a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard				enum pipe_video_cap param)
478a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
479a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch (param) {
480a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_VIDEO_CAP_SUPPORTED:
481a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return vl_profile_supported(screen, profile);
482a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_VIDEO_CAP_NPOT_TEXTURES:
483a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 1;
484a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_VIDEO_CAP_MAX_WIDTH:
485a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_VIDEO_CAP_MAX_HEIGHT:
486a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return vl_video_buffer_max_size(screen);
487a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case PIPE_VIDEO_CAP_PREFERED_FORMAT:
488a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return PIPE_FORMAT_NV12;
489a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default:
490a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0;
491a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
492a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
493a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
494a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic void r600_destroy_screen(struct pipe_screen* pscreen)
495a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
496a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
497a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
498a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rscreen == NULL)
499a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return;
500a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
501a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rscreen->fences.bo) {
502a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		struct r600_fence_block *entry, *tmp;
503a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
504a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		LIST_FOR_EACH_ENTRY_SAFE(entry, tmp, &rscreen->fences.blocks, head) {
505a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			LIST_DEL(&entry->head);
506a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			FREE(entry);
507a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
508a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
5090a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák		rscreen->ws->buffer_unmap(rscreen->fences.bo->cs_buf);
510fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König		si_resource_reference(&rscreen->fences.bo, NULL);
511a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
512a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	pipe_mutex_destroy(rscreen->fences.mutex);
513a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
514a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->ws->destroy(rscreen->ws);
515a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	FREE(rscreen);
516a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
517a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
518a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic void r600_fence_reference(struct pipe_screen *pscreen,
519a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                                 struct pipe_fence_handle **ptr,
520a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                                 struct pipe_fence_handle *fence)
521a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
522a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_fence **oldf = (struct r600_fence**)ptr;
523a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_fence *newf = (struct r600_fence*)fence;
524a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
525a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (pipe_reference(&(*oldf)->reference, &newf->reference)) {
526a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		struct r600_screen *rscreen = (struct r600_screen *)pscreen;
527a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		pipe_mutex_lock(rscreen->fences.mutex);
528fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König		si_resource_reference(&(*oldf)->sleep_bo, NULL);
529a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		LIST_ADDTAIL(&(*oldf)->head, &rscreen->fences.pool);
530a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		pipe_mutex_unlock(rscreen->fences.mutex);
531a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
532a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
533a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	*ptr = fence;
534a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
535a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
536a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic boolean r600_fence_signalled(struct pipe_screen *pscreen,
537a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                                    struct pipe_fence_handle *fence)
538a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
539a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
540a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_fence *rfence = (struct r600_fence*)fence;
541a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
542a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return rscreen->fences.data[rfence->index];
543a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
544a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
545a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic boolean r600_fence_finish(struct pipe_screen *pscreen,
546a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                                 struct pipe_fence_handle *fence,
547a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard                                 uint64_t timeout)
548a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
549a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = (struct r600_screen *)pscreen;
550a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_fence *rfence = (struct r600_fence*)fence;
551a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	int64_t start_time = 0;
552a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	unsigned spins = 0;
553a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
554a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (timeout != PIPE_TIMEOUT_INFINITE) {
555a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		start_time = os_time_get();
556a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
557a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* Convert to microseconds. */
558a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		timeout /= 1000;
559a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
560a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
561a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	while (rscreen->fences.data[rfence->index] == 0) {
562a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* Special-case infinite timeout - wait for the dummy BO to become idle */
563a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if (timeout == PIPE_TIMEOUT_INFINITE) {
564a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			rscreen->ws->buffer_wait(rfence->sleep_bo->buf, RADEON_USAGE_READWRITE);
565a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			break;
566a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
567a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
568a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		/* The dummy BO will be busy until the CS including the fence has completed, or
569a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		 * the GPU is reset. Don't bother continuing to spin when the BO is idle. */
570a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if (!rscreen->ws->buffer_is_busy(rfence->sleep_bo->buf, RADEON_USAGE_READWRITE))
571a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			break;
572a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
573a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if (++spins % 256)
574a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			continue;
575a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#ifdef PIPE_OS_UNIX
576a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		sched_yield();
577a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#else
578a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		os_time_sleep(10);
579a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#endif
580a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		if (timeout != PIPE_TIMEOUT_INFINITE &&
581a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		    os_time_get() - start_time >= timeout) {
582a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard			break;
583a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		}
584a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
585a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
586a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return rscreen->fences.data[rfence->index] != 0;
587a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
588a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
589a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic int evergreen_interpret_tiling(struct r600_screen *rscreen, uint32_t tiling_config)
590a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
591a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch (tiling_config & 0xf) {
592a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 0:
593a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.num_channels = 1;
594a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
595a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 1:
596a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.num_channels = 2;
597a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
598a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 2:
599a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.num_channels = 4;
600a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
601a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 3:
602a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.num_channels = 8;
603a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
604a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default:
605a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return -EINVAL;
606a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
607a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
608a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch ((tiling_config & 0xf0) >> 4) {
609a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 0:
610a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.num_banks = 4;
611a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
612a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 1:
613a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.num_banks = 8;
614a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
615a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 2:
616a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.num_banks = 16;
617a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
618a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default:
619a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return -EINVAL;
620a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
621a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
622a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch ((tiling_config & 0xf00) >> 8) {
623a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 0:
624a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.group_bytes = 256;
625a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
626a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	case 1:
627a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->tiling_info.group_bytes = 512;
628a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		break;
629a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default:
630a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return -EINVAL;
631a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
632a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return 0;
633a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
634a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
635a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic int r600_init_tiling(struct r600_screen *rscreen)
636a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
637a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	uint32_t tiling_config = rscreen->info.r600_tiling_config;
638a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
639a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* set default group bytes, overridden by tiling info ioctl */
640a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->tiling_info.group_bytes = 512;
641a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
642a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (!tiling_config)
643a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return 0;
644a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
645a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return evergreen_interpret_tiling(rscreen, tiling_config);
646a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
647a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
648a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstatic unsigned radeon_family_from_device(unsigned device)
649a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
650a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	switch (device) {
651a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#define CHIPSET(pciid, name, family) case pciid: return CHIP_##family;
652a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "pci_ids/radeonsi_pci_ids.h"
653a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#undef CHIPSET
654a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	default:
655a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return CHIP_UNKNOWN;
656a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
657a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
658a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
659a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstruct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
660a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
661a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	struct r600_screen *rscreen = CALLOC_STRUCT(r600_screen);
662a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rscreen == NULL) {
663a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
664a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
665a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
666a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->ws = ws;
667a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	ws->query_info(ws, &rscreen->info);
668a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
669a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->family = radeon_family_from_device(rscreen->info.pci_id);
670a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rscreen->family == CHIP_UNKNOWN) {
671a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		fprintf(stderr, "r600: Unknown chipset 0x%04X\n", rscreen->info.pci_id);
672a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		FREE(rscreen);
673a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
674a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
675a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
676a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	/* setup class */
677a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (rscreen->family >= CHIP_TAHITI) {
678a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		rscreen->chip_class = TAHITI;
679a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	} else {
680a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		fprintf(stderr, "r600: Unsupported family %d\n", rscreen->family);
681a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		FREE(rscreen);
682a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
683a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
684a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
685a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	if (r600_init_tiling(rscreen)) {
686a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		FREE(rscreen);
687a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard		return NULL;
688a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	}
689a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
690a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.destroy = r600_destroy_screen;
691a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.get_name = r600_get_name;
692a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.get_vendor = r600_get_vendor;
693a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.get_param = r600_get_param;
694a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.get_shader_param = r600_get_shader_param;
695a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.get_paramf = r600_get_paramf;
696a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.get_video_param = r600_get_video_param;
697a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.is_format_supported = si_is_format_supported;
698a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.is_video_format_supported = vl_video_buffer_is_format_supported;
699a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.context_create = r600_create_context;
700a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.fence_reference = r600_fence_reference;
701a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.fence_signalled = r600_fence_signalled;
702a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->screen.fence_finish = r600_fence_finish;
703a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	r600_init_screen_resource_functions(&rscreen->screen);
704a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
705a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	util_format_s3tc_init();
706a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
707a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->fences.bo = NULL;
708a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->fences.data = NULL;
709a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	rscreen->fences.next_index = 0;
710a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	LIST_INITHEAD(&rscreen->fences.pool);
711a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	LIST_INITHEAD(&rscreen->fences.blocks);
712a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	pipe_mutex_init(rscreen->fences.mutex);
713a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
714a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard	return &rscreen->screen;
715a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
716