17bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/************************************************************************** 27bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * 37bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * Copyright 2013 Advanced Micro Devices, Inc. 47bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * All Rights Reserved. 57bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * 67bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * Permission is hereby granted, free of charge, to any person obtaining a 77bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * copy of this software and associated documentation files (the 87bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * "Software"), to deal in the Software without restriction, including 97bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * without limitation the rights to use, copy, modify, merge, publish, 107bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * distribute, sub license, and/or sell copies of the Software, and to 117bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * permit persons to whom the Software is furnished to do so, subject to 127bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * the following conditions: 137bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * 147bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * The above copyright notice and this permission notice (including the 157bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * next paragraph) shall be included in all copies or substantial portions 167bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * of the Software. 177bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * 187bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 197bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 207bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 217bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR 227bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 237bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 247bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 257bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * 267bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König **************************************************************************/ 277bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 287bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/* 297bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * Authors: 307bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * Christian König <christian.koenig@amd.com> 317bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * 327bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König */ 337bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 347bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include <unistd.h> 357bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 367bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include "util/u_memory.h" 377bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include "util/u_video.h" 387bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 397bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include "vl/vl_defines.h" 407bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include "vl/vl_video_buffer.h" 417bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 427bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include "r600_pipe_common.h" 437bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König#include "radeon_video.h" 449ff0cf903dc4ed806961d1e099d1308322092892Christian König#include "radeon_vce.h" 457bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 4636df04dac4a2f8a714f2497465cc983dab849246Christian König#define UVD_FW_1_66_16 ((1 << 24) | (66 << 16) | (16 << 8)) 4736df04dac4a2f8a714f2497465cc983dab849246Christian König 487bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/* generate an stream handle */ 497bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian Königunsigned rvid_alloc_stream_handle() 507bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 517bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König static unsigned counter = 0; 527bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König unsigned stream_handle = 0; 537bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König unsigned pid = getpid(); 547bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König int i; 557bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 567bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König for (i = 0; i < 32; ++i) 577bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König stream_handle |= ((pid >> i) & 1) << (31 - i); 587bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 597bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König stream_handle ^= ++counter; 607bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return stream_handle; 617bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 627bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 637bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/* create a buffer in the winsys */ 644bc0059229f212e91ca266ef3f80b652b1cdcb86Christian Königbool rvid_create_buffer(struct pipe_screen *screen, struct rvid_buffer *buffer, 654bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König unsigned size, unsigned usage) 667bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 674bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König memset(buffer, 0, sizeof(*buffer)); 684bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König buffer->usage = usage; 6913cb41f666212ed50a7939a37a373b4431a84033Nicolai Hähnle 7013cb41f666212ed50a7939a37a373b4431a84033Nicolai Hähnle /* Hardware buffer placement restrictions require the kernel to be 7113cb41f666212ed50a7939a37a373b4431a84033Nicolai Hähnle * able to move buffers around individually, so request a 7213cb41f666212ed50a7939a37a373b4431a84033Nicolai Hähnle * non-sub-allocated buffer. 7313cb41f666212ed50a7939a37a373b4431a84033Nicolai Hähnle */ 744bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König buffer->res = (struct r600_resource *) 7529144d0f34d9325a3549e4ed0feecc0577c70358Marek Olšák pipe_buffer_create(screen, PIPE_BIND_SHARED, 7613cb41f666212ed50a7939a37a373b4431a84033Nicolai Hähnle usage, size); 779b218dcdd7877b81d8b6c55799b6ec33e1cc8079Christian König 784bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König return buffer->res != NULL; 797bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 807bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 817bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/* destroy a buffer */ 827bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian Königvoid rvid_destroy_buffer(struct rvid_buffer *buffer) 837bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 84d5383a7d3114aa5f81a704ff84f58de6b41f94bdMarek Olšák r600_resource_reference(&buffer->res, NULL); 857bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 867bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 877bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/* reallocate a buffer, preserving its content */ 884bc0059229f212e91ca266ef3f80b652b1cdcb86Christian Königbool rvid_resize_buffer(struct pipe_screen *screen, struct radeon_winsys_cs *cs, 897bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König struct rvid_buffer *new_buf, unsigned new_size) 907bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 914bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König struct r600_common_screen *rscreen = (struct r600_common_screen *)screen; 924bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König struct radeon_winsys* ws = rscreen->ws; 934bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König unsigned bytes = MIN2(new_buf->res->buf->size, new_size); 947bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König struct rvid_buffer old_buf = *new_buf; 957bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König void *src = NULL, *dst = NULL; 967bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 974bc0059229f212e91ca266ef3f80b652b1cdcb86Christian König if (!rvid_create_buffer(screen, new_buf, new_size, new_buf->usage)) 987bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König goto error; 997bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 100cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák src = ws->buffer_map(old_buf.res->buf, cs, PIPE_TRANSFER_READ); 1017bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!src) 1027bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König goto error; 1037bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 104cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák dst = ws->buffer_map(new_buf->res->buf, cs, PIPE_TRANSFER_WRITE); 1057bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!dst) 1067bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König goto error; 1077bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1087bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König memcpy(dst, src, bytes); 1097bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (new_size > bytes) { 1107bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König new_size -= bytes; 1117bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König dst += bytes; 1127bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König memset(dst, 0, new_size); 1137bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 114cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák ws->buffer_unmap(new_buf->res->buf); 115cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák ws->buffer_unmap(old_buf.res->buf); 1167bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König rvid_destroy_buffer(&old_buf); 1177bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return true; 1187bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1197bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian Königerror: 1207bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (src) 121cf811faeff1eaa1aef817ae45314cc3419c44222Marek Olšák ws->buffer_unmap(old_buf.res->buf); 1227bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König rvid_destroy_buffer(new_buf); 1237bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König *new_buf = old_buf; 1247bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return false; 1257bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 1267bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1277bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/* clear the buffer with zeros */ 1284dfdcdb4b394df72da769806a0b64025e475f8b3Christian Königvoid rvid_clear_buffer(struct pipe_context *context, struct rvid_buffer* buffer) 1297bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 1304dfdcdb4b394df72da769806a0b64025e475f8b3Christian König struct r600_common_context *rctx = (struct r600_common_context*)context; 1317bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 13269f489dfa11a6182c413c252addb0b0010550861Marek Olšák rctx->dma_clear_buffer(context, &buffer->res->b.b, 0, 13369f489dfa11a6182c413c252addb0b0010550861Marek Olšák buffer->res->buf->size, 0); 1344dfdcdb4b394df72da769806a0b64025e475f8b3Christian König context->flush(context, NULL, 0); 1357bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 1367bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1377bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König/** 1387bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * join surfaces into the same buffer with identical tiling params 1397bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König * sumup their sizes and replace the backend buffers with a single bo 1407bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König */ 141c868974396e95d900c7754bce38c0c950f6e3ab6Nicolai Hähnlevoid rvid_join_surfaces(struct radeon_winsys* ws, 1427bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König struct pb_buffer** buffers[VL_NUM_COMPONENTS], 143a582b22c6382f24d921e9fe8a24917100c1396f1Marek Olšák struct radeon_surf *surfaces[VL_NUM_COMPONENTS]) 1447bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 1457bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König unsigned best_tiling, best_wh, off; 1467bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König unsigned size, alignment; 1477bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König struct pb_buffer *pb; 1487bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König unsigned i, j; 1497bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1507bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König for (i = 0, best_tiling = 0, best_wh = ~0; i < VL_NUM_COMPONENTS; ++i) { 1517bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König unsigned wh; 1527bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1537bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!surfaces[i]) 1547bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König continue; 1557bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1567bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König /* choose the smallest bank w/h for now */ 1577bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König wh = surfaces[i]->bankw * surfaces[i]->bankh; 1587bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (wh < best_wh) { 1597bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König best_wh = wh; 1607bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König best_tiling = i; 1617bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 1627bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 1637bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1647bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König for (i = 0, off = 0; i < VL_NUM_COMPONENTS; ++i) { 1657bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!surfaces[i]) 1667bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König continue; 1677bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1687bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König /* copy the tiling parameters */ 1697bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König surfaces[i]->bankw = surfaces[best_tiling]->bankw; 1707bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König surfaces[i]->bankh = surfaces[best_tiling]->bankh; 1717bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König surfaces[i]->mtilea = surfaces[best_tiling]->mtilea; 1727bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König surfaces[i]->tile_split = surfaces[best_tiling]->tile_split; 1737bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1747bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König /* adjust the texture layer offsets */ 1752a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák off = align(off, surfaces[i]->surf_alignment); 17647b390fe45e5e6f982c60b58985892438959cd8eJan Vesely for (j = 0; j < ARRAY_SIZE(surfaces[i]->level); ++j) 1777bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König surfaces[i]->level[j].offset += off; 1782a2e53757796b3fed3119cb033e5cf5144843850Marek Olšák off += surfaces[i]->surf_size; 1797bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 1807bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1817bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König for (i = 0, size = 0, alignment = 0; i < VL_NUM_COMPONENTS; ++i) { 1827bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!buffers[i] || !*buffers[i]) 1837bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König continue; 1847bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1857bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König size = align(size, (*buffers[i])->alignment); 1867bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König size += (*buffers[i])->size; 1877bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König alignment = MAX2(alignment, (*buffers[i])->alignment * 1); 1887bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 1897bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1907bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!size) 1917bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return; 1927bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 1937bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König /* TODO: 2D tiling workaround */ 1947bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König alignment *= 2; 1957bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 196562c4a17b7e4fb56c7db679233b4a48f8b80b0f2Nicolai Hähnle pb = ws->buffer_create(ws, size, alignment, RADEON_DOMAIN_VRAM, 0); 1977bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!pb) 1987bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return; 1997bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 2007bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 2017bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (!buffers[i] || !*buffers[i]) 2027bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König continue; 2037bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 2047bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König pb_reference(buffers[i], pb); 2057bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 2067bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 2077bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König pb_reference(&pb, NULL); 2087bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 2097bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 2107bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian Königint rvid_get_video_param(struct pipe_screen *screen, 2117bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König enum pipe_video_profile profile, 2127bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König enum pipe_video_entrypoint entrypoint, 2137bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König enum pipe_video_cap param) 2147bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 2157bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König struct r600_common_screen *rscreen = (struct r600_common_screen *)screen; 2167b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher enum pipe_video_format codec = u_reduce_video_profile(profile); 21736df04dac4a2f8a714f2497465cc983dab849246Christian König struct radeon_info info; 21836df04dac4a2f8a714f2497465cc983dab849246Christian König 21936df04dac4a2f8a714f2497465cc983dab849246Christian König rscreen->ws->query_info(rscreen->ws, &info); 2207bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 2219ff0cf903dc4ed806961d1e099d1308322092892Christian König if (entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) { 2229ff0cf903dc4ed806961d1e099d1308322092892Christian König switch (param) { 2239ff0cf903dc4ed806961d1e099d1308322092892Christian König case PIPE_VIDEO_CAP_SUPPORTED: 2247b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher return codec == PIPE_VIDEO_FORMAT_MPEG4_AVC && 2259ff0cf903dc4ed806961d1e099d1308322092892Christian König rvce_is_fw_version_supported(rscreen); 2265290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_NPOT_TEXTURES: 2275290bf43c8024561095ab96b54cd09b80b135528Christian König return 1; 2285290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_MAX_WIDTH: 229c29f0d4722832a9d284aba899875955e60a41c03Leo Liu return (rscreen->family < CHIP_TONGA) ? 2048 : 4096; 2305290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_MAX_HEIGHT: 231c29f0d4722832a9d284aba899875955e60a41c03Leo Liu return (rscreen->family < CHIP_TONGA) ? 1152 : 2304; 2325290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_PREFERED_FORMAT: 2335290bf43c8024561095ab96b54cd09b80b135528Christian König return PIPE_FORMAT_NV12; 2345290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_PREFERS_INTERLACED: 2355290bf43c8024561095ab96b54cd09b80b135528Christian König return false; 2365290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED: 2375290bf43c8024561095ab96b54cd09b80b135528Christian König return false; 2385290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE: 2395290bf43c8024561095ab96b54cd09b80b135528Christian König return true; 2405290bf43c8024561095ab96b54cd09b80b135528Christian König case PIPE_VIDEO_CAP_STACKED_FRAMES: 2414dfcf6e3a91be97fcf9d3f44e76a7a389f8f40b2Leo Liu return (rscreen->family < CHIP_TONGA) ? 1 : 2; 2425290bf43c8024561095ab96b54cd09b80b135528Christian König default: 2435290bf43c8024561095ab96b54cd09b80b135528Christian König return 0; 2449ff0cf903dc4ed806961d1e099d1308322092892Christian König } 2459ff0cf903dc4ed806961d1e099d1308322092892Christian König } 2469ff0cf903dc4ed806961d1e099d1308322092892Christian König 2477bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König switch (param) { 2487bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_SUPPORTED: 2497b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher switch (codec) { 2507bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_FORMAT_MPEG12: 251e148a3b6e9e5c5cd941b70edb67e82058a8187a5Christian König return profile != PIPE_VIDEO_PROFILE_MPEG1; 2527bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_FORMAT_MPEG4: 25336df04dac4a2f8a714f2497465cc983dab849246Christian König /* no support for MPEG4 on older hw */ 25436df04dac4a2f8a714f2497465cc983dab849246Christian König return rscreen->family >= CHIP_PALM; 2557bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_FORMAT_MPEG4_AVC: 25636df04dac4a2f8a714f2497465cc983dab849246Christian König if ((rscreen->family == CHIP_POLARIS10 || 25736df04dac4a2f8a714f2497465cc983dab849246Christian König rscreen->family == CHIP_POLARIS11) && 25836df04dac4a2f8a714f2497465cc983dab849246Christian König info.uvd_fw_version < UVD_FW_1_66_16 ) { 25936df04dac4a2f8a714f2497465cc983dab849246Christian König RVID_ERR("POLARIS10/11 firmware version need to be updated.\n"); 26036df04dac4a2f8a714f2497465cc983dab849246Christian König return false; 26136df04dac4a2f8a714f2497465cc983dab849246Christian König } 2627b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher return true; 2637bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_FORMAT_VC1: 2646bad554d98004e6c8ab46e8cbe73f3b3024e55c5Boyuan Zhang return true; 265839bf82606ae9c7b1c7d8d5055ab5e3cadae9bf9Boyuan Zhang case PIPE_VIDEO_FORMAT_HEVC: 266839bf82606ae9c7b1c7d8d5055ab5e3cadae9bf9Boyuan Zhang /* Carrizo only supports HEVC Main */ 26706c862d67d2e8686fa8614019f1170c2f7f71028Boyuan Zhang if (rscreen->family >= CHIP_STONEY) 26806c862d67d2e8686fa8614019f1170c2f7f71028Boyuan Zhang return (profile == PIPE_VIDEO_PROFILE_HEVC_MAIN || 26906c862d67d2e8686fa8614019f1170c2f7f71028Boyuan Zhang profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10); 27006c862d67d2e8686fa8614019f1170c2f7f71028Boyuan Zhang else if (rscreen->family >= CHIP_CARRIZO) 27106c862d67d2e8686fa8614019f1170c2f7f71028Boyuan Zhang return profile == PIPE_VIDEO_PROFILE_HEVC_MAIN; 2727bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König default: 2737bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return false; 2747bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 2757bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_NPOT_TEXTURES: 2767bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 1; 2777bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_MAX_WIDTH: 278c29f0d4722832a9d284aba899875955e60a41c03Leo Liu return (rscreen->family < CHIP_TONGA) ? 2048 : 4096; 2797bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_MAX_HEIGHT: 280353a4f844f9e845dad93de9c28fa0d484b4b92d3Tamil velan return (rscreen->family < CHIP_TONGA) ? 1152 : 4096; 2817bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_PREFERED_FORMAT: 2827bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return PIPE_FORMAT_NV12; 2837bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_PREFERS_INTERLACED: 2847bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED: 2857b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher if (rscreen->family < CHIP_PALM) { 2867b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher /* MPEG2 only with shaders and no support for 2877b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher interlacing on R6xx style UVD */ 2887b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher return codec != PIPE_VIDEO_FORMAT_MPEG12 && 2897b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher rscreen->family > CHIP_RV770; 2907b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher } else { 2917b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher if (u_reduce_video_profile(profile) == PIPE_VIDEO_FORMAT_HEVC) 2927b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher return false; //The firmware doesn't support interlaced HEVC. 2937b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher return true; 2947b636581253fe858ac883e3d3eec21173ac069d4Alex Deucher } 2957bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE: 2967bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return true; 2977bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_CAP_MAX_LEVEL: 2987bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König switch (profile) { 2997bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG1: 3007bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 0; 3017bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE: 3027bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG2_MAIN: 3037bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 3; 3047bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE: 3057bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 3; 3067bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE: 3077bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 5; 3087bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_VC1_SIMPLE: 3097bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 1; 3107bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_VC1_MAIN: 3117bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 2; 3127bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_VC1_ADVANCED: 3137bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 4; 3147bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: 3157bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: 3167bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: 317b3e75c39976c03f73128ffd802465799ac0e4ef5Christian König return (rscreen->family < CHIP_TONGA) ? 41 : 52; 318839bf82606ae9c7b1c7d8d5055ab5e3cadae9bf9Boyuan Zhang case PIPE_VIDEO_PROFILE_HEVC_MAIN: 31906c862d67d2e8686fa8614019f1170c2f7f71028Boyuan Zhang case PIPE_VIDEO_PROFILE_HEVC_MAIN_10: 320839bf82606ae9c7b1c7d8d5055ab5e3cadae9bf9Boyuan Zhang return 186; 3217bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König default: 3227bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 0; 3237bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 3247bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König default: 3257bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return 0; 3267bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König } 3277bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 3287bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 3297bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian Königboolean rvid_is_format_supported(struct pipe_screen *screen, 3307bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König enum pipe_format format, 3317bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König enum pipe_video_profile profile, 3327bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König enum pipe_video_entrypoint entrypoint) 3337bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König{ 3347bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König /* we can only handle this one with UVD */ 3357bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König if (profile != PIPE_VIDEO_PROFILE_UNKNOWN) 3367bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return format == PIPE_FORMAT_NV12; 3377bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König 3387bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König return vl_video_buffer_is_format_supported(screen, format, profile, entrypoint); 3397bcfb0bc8ffed0db244cf0b3d4e200add590a02aChristian König} 340