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