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