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