summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nvc0
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2013-08-10 13:27:47 -0400
committerMaarten Lankhorst <[email protected]>2013-08-15 15:19:47 +0200
commitb57875bbb3c677eee8930b41b03fbd2544278a6b (patch)
tree7104f958a9a68c474fc6d5e8626584bbd5804e32 /src/gallium/drivers/nvc0
parent940f7cec77316687e2b92c13a2446c88df0ece45 (diff)
nvc0: refactor video buffer management logic into nouveau_vp3
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers/nvc0')
-rw-r--r--src/gallium/drivers/nvc0/nvc0_video.c135
-rw-r--r--src/gallium/drivers/nvc0/nvc0_video.h29
-rw-r--r--src/gallium/drivers/nvc0/nvc0_video_bsp.c4
-rw-r--r--src/gallium/drivers/nvc0/nvc0_video_ppp.c6
-rw-r--r--src/gallium/drivers/nvc0/nvc0_video_vp.c38
5 files changed, 38 insertions, 174 deletions
diff --git a/src/gallium/drivers/nvc0/nvc0_video.c b/src/gallium/drivers/nvc0/nvc0_video.c
index a871ab792d7..2fc9233dc96 100644
--- a/src/gallium/drivers/nvc0/nvc0_video.c
+++ b/src/gallium/drivers/nvc0/nvc0_video.c
@@ -88,12 +88,12 @@ nvc0_decoder_decode_bitstream(struct pipe_video_decoder *decoder,
const unsigned *num_bytes)
{
struct nvc0_decoder *dec = (struct nvc0_decoder *)decoder;
- struct nvc0_video_buffer *target = (struct nvc0_video_buffer *)video_target;
+ struct nouveau_vp3_video_buffer *target = (struct nouveau_vp3_video_buffer *)video_target;
uint32_t comm_seq = ++dec->fence_seq;
union pipe_desc desc;
unsigned vp_caps, is_ref, ret;
- struct nvc0_video_buffer *refs[16] = {};
+ struct nouveau_vp3_video_buffer *refs[16] = {};
desc.base = picture;
@@ -531,137 +531,10 @@ fail:
return NULL;
}
-static struct pipe_sampler_view **
-nvc0_video_buffer_sampler_view_planes(struct pipe_video_buffer *buffer)
-{
- struct nvc0_video_buffer *buf = (struct nvc0_video_buffer *)buffer;
- return buf->sampler_view_planes;
-}
-
-static struct pipe_sampler_view **
-nvc0_video_buffer_sampler_view_components(struct pipe_video_buffer *buffer)
-{
- struct nvc0_video_buffer *buf = (struct nvc0_video_buffer *)buffer;
- return buf->sampler_view_components;
-}
-
-static struct pipe_surface **
-nvc0_video_buffer_surfaces(struct pipe_video_buffer *buffer)
-{
- struct nvc0_video_buffer *buf = (struct nvc0_video_buffer *)buffer;
- return buf->surfaces;
-}
-
-static void
-nvc0_video_buffer_destroy(struct pipe_video_buffer *buffer)
-{
- struct nvc0_video_buffer *buf = (struct nvc0_video_buffer *)buffer;
- unsigned i;
-
- assert(buf);
-
- for (i = 0; i < VL_NUM_COMPONENTS; ++i) {
- pipe_resource_reference(&buf->resources[i], NULL);
- pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL);
- pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL);
- pipe_surface_reference(&buf->surfaces[i * 2], NULL);
- pipe_surface_reference(&buf->surfaces[i * 2 + 1], NULL);
- }
- FREE(buffer);
-}
-
struct pipe_video_buffer *
nvc0_video_buffer_create(struct pipe_context *pipe,
const struct pipe_video_buffer *templat)
{
- struct nvc0_video_buffer *buffer;
- struct pipe_resource templ;
- unsigned i, j, component;
- struct pipe_sampler_view sv_templ;
- struct pipe_surface surf_templ;
-
- assert(templat->interlaced);
- if (getenv("XVMC_VL") || templat->buffer_format != PIPE_FORMAT_NV12)
- return vl_video_buffer_create(pipe, templat);
-
- assert(templat->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420);
-
- buffer = CALLOC_STRUCT(nvc0_video_buffer);
- if (!buffer)
- return NULL;
-
- buffer->base.buffer_format = templat->buffer_format;
- buffer->base.context = pipe;
- buffer->base.destroy = nvc0_video_buffer_destroy;
- buffer->base.chroma_format = templat->chroma_format;
- buffer->base.width = templat->width;
- buffer->base.height = templat->height;
- buffer->base.get_sampler_view_planes = nvc0_video_buffer_sampler_view_planes;
- buffer->base.get_sampler_view_components = nvc0_video_buffer_sampler_view_components;
- buffer->base.get_surfaces = nvc0_video_buffer_surfaces;
- buffer->base.interlaced = true;
-
- memset(&templ, 0, sizeof(templ));
- templ.target = PIPE_TEXTURE_2D_ARRAY;
- templ.depth0 = 1;
- templ.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
- templ.format = PIPE_FORMAT_R8_UNORM;
- templ.width0 = buffer->base.width;
- templ.height0 = (buffer->base.height + 1)/2;
- templ.flags = NVC0_RESOURCE_FLAG_VIDEO;
- templ.array_size = 2;
-
- buffer->resources[0] = pipe->screen->resource_create(pipe->screen, &templ);
- if (!buffer->resources[0])
- goto error;
-
- templ.format = PIPE_FORMAT_R8G8_UNORM;
- buffer->num_planes = 2;
- templ.width0 = (templ.width0 + 1) / 2;
- templ.height0 = (templ.height0 + 1) / 2;
- for (i = 1; i < buffer->num_planes; ++i) {
- buffer->resources[i] = pipe->screen->resource_create(pipe->screen, &templ);
- if (!buffer->resources[i])
- goto error;
- }
-
- memset(&sv_templ, 0, sizeof(sv_templ));
- for (component = 0, i = 0; i < buffer->num_planes; ++i ) {
- struct pipe_resource *res = buffer->resources[i];
- unsigned nr_components = util_format_get_nr_components(res->format);
-
- u_sampler_view_default_template(&sv_templ, res, res->format);
- buffer->sampler_view_planes[i] = pipe->create_sampler_view(pipe, res, &sv_templ);
- if (!buffer->sampler_view_planes[i])
- goto error;
-
- for (j = 0; j < nr_components; ++j, ++component) {
- sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = PIPE_SWIZZLE_RED + j;
- sv_templ.swizzle_a = PIPE_SWIZZLE_ONE;
-
- buffer->sampler_view_components[component] = pipe->create_sampler_view(pipe, res, &sv_templ);
- if (!buffer->sampler_view_components[component])
- goto error;
- }
- }
-
- memset(&surf_templ, 0, sizeof(surf_templ));
- for (j = 0; j < buffer->num_planes; ++j) {
- surf_templ.format = buffer->resources[j]->format;
- surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = 0;
- buffer->surfaces[j * 2] = pipe->create_surface(pipe, buffer->resources[j], &surf_templ);
- if (!buffer->surfaces[j * 2])
- goto error;
-
- surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = 1;
- buffer->surfaces[j * 2 + 1] = pipe->create_surface(pipe, buffer->resources[j], &surf_templ);
- if (!buffer->surfaces[j * 2 + 1])
- goto error;
- }
-
- return &buffer->base;
-
-error:
- nvc0_video_buffer_destroy(&buffer->base);
- return NULL;
+ return nouveau_vp3_video_buffer_create(
+ pipe, templat, NVC0_RESOURCE_FLAG_VIDEO);
}
diff --git a/src/gallium/drivers/nvc0/nvc0_video.h b/src/gallium/drivers/nvc0/nvc0_video.h
index aed1424bad6..271ed5c988a 100644
--- a/src/gallium/drivers/nvc0/nvc0_video.h
+++ b/src/gallium/drivers/nvc0/nvc0_video.h
@@ -22,9 +22,9 @@
#include "nvc0_context.h"
#include "nvc0_screen.h"
+#include "nouveau/nouveau_vp3_video.h"
#include "vl/vl_decoder.h"
-#include "vl/vl_video_buffer.h"
#include "vl/vl_types.h"
#include "util/u_video.h"
@@ -53,15 +53,6 @@ union pipe_desc {
struct pipe_h264_picture_desc *h264;
};
-struct nvc0_video_buffer {
- struct pipe_video_buffer base;
- unsigned num_planes, valid_ref;
- struct pipe_resource *resources[VL_NUM_COMPONENTS];
- struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS];
- struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS];
- struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2];
-};
-
struct nvc0_decoder {
struct pipe_video_decoder base;
struct nouveau_client *client;
@@ -105,7 +96,7 @@ struct nvc0_decoder {
// and give shaders a chance to run as well.
struct {
- struct nvc0_video_buffer *vidbuf;
+ struct nouveau_vp3_video_buffer *vidbuf;
unsigned last_used;
unsigned field_pic_flag : 1;
unsigned decoded_top : 1;
@@ -151,7 +142,7 @@ static INLINE uint32_t mb_half(uint32_t coord)
}
static INLINE uint64_t
-nvc0_video_addr(struct nvc0_decoder *dec, struct nvc0_video_buffer *target)
+nvc0_video_addr(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *target)
{
uint64_t ret;
if (target)
@@ -197,25 +188,25 @@ nvc0_decoder_inter_sizes(struct nvc0_decoder *dec, uint32_t slice_count,
extern unsigned
nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
- struct nvc0_video_buffer *target,
+ struct nouveau_vp3_video_buffer *target,
unsigned comm_seq, unsigned num_buffers,
const void *const *data, const unsigned *num_bytes,
unsigned *vp_caps, unsigned *is_ref,
- struct nvc0_video_buffer *refs[16]);
+ struct nouveau_vp3_video_buffer *refs[16]);
extern void nvc0_decoder_vp_caps(struct nvc0_decoder *dec,
union pipe_desc desc,
- struct nvc0_video_buffer *target,
+ struct nouveau_vp3_video_buffer *target,
unsigned comm_seq,
unsigned *caps, unsigned *is_ref,
- struct nvc0_video_buffer *refs[16]);
+ struct nouveau_vp3_video_buffer *refs[16]);
extern void
nvc0_decoder_vp(struct nvc0_decoder *dec, union pipe_desc desc,
- struct nvc0_video_buffer *target, unsigned comm_seq,
+ struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
unsigned caps, unsigned is_ref,
- struct nvc0_video_buffer *refs[16]);
+ struct nouveau_vp3_video_buffer *refs[16]);
extern void
nvc0_decoder_ppp(struct nvc0_decoder *dec, union pipe_desc desc,
- struct nvc0_video_buffer *target, unsigned comm_seq);
+ struct nouveau_vp3_video_buffer *target, unsigned comm_seq);
diff --git a/src/gallium/drivers/nvc0/nvc0_video_bsp.c b/src/gallium/drivers/nvc0/nvc0_video_bsp.c
index 450dc2bb528..8f93861ec59 100644
--- a/src/gallium/drivers/nvc0/nvc0_video_bsp.c
+++ b/src/gallium/drivers/nvc0/nvc0_video_bsp.c
@@ -241,11 +241,11 @@ static void dump_comm_bsp(struct comm *comm)
unsigned
nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
- struct nvc0_video_buffer *target,
+ struct nouveau_vp3_video_buffer *target,
unsigned comm_seq, unsigned num_buffers,
const void *const *data, const unsigned *num_bytes,
unsigned *vp_caps, unsigned *is_ref,
- struct nvc0_video_buffer *refs[16])
+ struct nouveau_vp3_video_buffer *refs[16])
{
struct nouveau_pushbuf *push = dec->pushbuf[0];
enum pipe_video_codec codec = u_reduce_video_profile(dec->base.profile);
diff --git a/src/gallium/drivers/nvc0/nvc0_video_ppp.c b/src/gallium/drivers/nvc0/nvc0_video_ppp.c
index efa25270e8d..823e3608819 100644
--- a/src/gallium/drivers/nvc0/nvc0_video_ppp.c
+++ b/src/gallium/drivers/nvc0/nvc0_video_ppp.c
@@ -23,7 +23,7 @@
#include "nvc0_video.h"
static void
-nvc0_decoder_setup_ppp(struct nvc0_decoder *dec, struct nvc0_video_buffer *target, uint32_t low700) {
+nvc0_decoder_setup_ppp(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *target, uint32_t low700) {
struct nouveau_pushbuf *push = dec->pushbuf[2];
uint32_t stride_in = mb(dec->base.width);
@@ -73,7 +73,7 @@ nvc0_decoder_setup_ppp(struct nvc0_decoder *dec, struct nvc0_video_buffer *targe
}
static uint32_t
-nvc0_decoder_vc1_ppp(struct nvc0_decoder *dec, struct pipe_vc1_picture_desc *desc, struct nvc0_video_buffer *target) {
+nvc0_decoder_vc1_ppp(struct nvc0_decoder *dec, struct pipe_vc1_picture_desc *desc, struct nouveau_vp3_video_buffer *target) {
struct nouveau_pushbuf *push = dec->pushbuf[2];
nvc0_decoder_setup_ppp(dec, target, 0x1412);
@@ -89,7 +89,7 @@ nvc0_decoder_vc1_ppp(struct nvc0_decoder *dec, struct pipe_vc1_picture_desc *des
}
void
-nvc0_decoder_ppp(struct nvc0_decoder *dec, union pipe_desc desc, struct nvc0_video_buffer *target, unsigned comm_seq) {
+nvc0_decoder_ppp(struct nvc0_decoder *dec, union pipe_desc desc, struct nouveau_vp3_video_buffer *target, unsigned comm_seq) {
enum pipe_video_codec codec = u_reduce_video_profile(dec->base.profile);
struct nouveau_pushbuf *push = dec->pushbuf[2];
unsigned ppp_caps = 0x10;
diff --git a/src/gallium/drivers/nvc0/nvc0_video_vp.c b/src/gallium/drivers/nvc0/nvc0_video_vp.c
index c5d4f9418da..7c1691c04cf 100644
--- a/src/gallium/drivers/nvc0/nvc0_video_vp.c
+++ b/src/gallium/drivers/nvc0/nvc0_video_vp.c
@@ -170,7 +170,7 @@ struct h264_picparm_vp { // 700..a00
};
static void
-nvc0_decoder_handle_references(struct nvc0_decoder *dec, struct nvc0_video_buffer *refs[16], unsigned seq, struct nvc0_video_buffer *target)
+nvc0_decoder_handle_references(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *refs[16], unsigned seq, struct nouveau_vp3_video_buffer *target)
{
unsigned h264 = u_reduce_video_profile(dec->base.profile) == PIPE_VIDEO_CODEC_MPEG4_AVC;
unsigned i, idx, empty_spot = dec->base.max_references + 1;
@@ -221,7 +221,7 @@ nvc0_decoder_handle_references(struct nvc0_decoder *dec, struct nvc0_video_buffe
}
static void
-nvc0_decoder_kick_ref(struct nvc0_decoder *dec, struct nvc0_video_buffer *target)
+nvc0_decoder_kick_ref(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *target)
{
dec->refs[target->valid_ref].vidbuf = NULL;
dec->refs[target->valid_ref].last_used = 0;
@@ -231,7 +231,7 @@ nvc0_decoder_kick_ref(struct nvc0_decoder *dec, struct nvc0_video_buffer *target
static uint32_t
nvc0_decoder_fill_picparm_mpeg12_vp(struct nvc0_decoder *dec,
struct pipe_mpeg12_picture_desc *desc,
- struct nvc0_video_buffer *refs[16],
+ struct nouveau_vp3_video_buffer *refs[16],
unsigned *is_ref,
char *map)
{
@@ -272,15 +272,15 @@ nvc0_decoder_fill_picparm_mpeg12_vp(struct nvc0_decoder *dec,
memcpy(pic_vp->intra_quantizer_matrix, desc->intra_matrix, 0x40);
memcpy(pic_vp->non_intra_quantizer_matrix, desc->non_intra_matrix, 0x40);
memcpy(map, pic_vp, sizeof(*pic_vp));
- refs[0] = (struct nvc0_video_buffer *)desc->ref[0];
- refs[!!refs[0]] = (struct nvc0_video_buffer *)desc->ref[1];
+ refs[0] = (struct nouveau_vp3_video_buffer *)desc->ref[0];
+ refs[!!refs[0]] = (struct nouveau_vp3_video_buffer *)desc->ref[1];
return ret | (dec->base.profile != PIPE_VIDEO_PROFILE_MPEG1);
}
static uint32_t
nvc0_decoder_fill_picparm_mpeg4_vp(struct nvc0_decoder *dec,
struct pipe_mpeg4_picture_desc *desc,
- struct nvc0_video_buffer *refs[16],
+ struct nouveau_vp3_video_buffer *refs[16],
unsigned *is_ref,
char *map)
{
@@ -320,15 +320,15 @@ nvc0_decoder_fill_picparm_mpeg4_vp(struct nvc0_decoder *dec,
memcpy(pic_vp->intra, desc->intra_matrix, 0x40);
memcpy(pic_vp->non_intra, desc->non_intra_matrix, 0x40);
memcpy(map, pic_vp, sizeof(*pic_vp));
- refs[0] = (struct nvc0_video_buffer *)desc->ref[0];
- refs[!!refs[0]] = (struct nvc0_video_buffer *)desc->ref[1];
+ refs[0] = (struct nouveau_vp3_video_buffer *)desc->ref[0];
+ refs[!!refs[0]] = (struct nouveau_vp3_video_buffer *)desc->ref[1];
return ret;
}
static uint32_t
nvc0_decoder_fill_picparm_h264_vp(struct nvc0_decoder *dec,
const struct pipe_h264_picture_desc *d,
- struct nvc0_video_buffer *refs[16],
+ struct nouveau_vp3_video_buffer *refs[16],
unsigned *is_ref,
char *map)
{
@@ -377,7 +377,7 @@ nvc0_decoder_fill_picparm_h264_vp(struct nvc0_decoder *dec,
for (i = 0; i < d->num_ref_frames; ++i) {
if (!d->ref[i])
break;
- refs[j] = (struct nvc0_video_buffer *)d->ref[i];
+ refs[j] = (struct nouveau_vp3_video_buffer *)d->ref[i];
h->refs[j].fifo_idx = j + 1;
h->refs[j].tmp_idx = refs[j]->valid_ref;
h->refs[j].field_order_cnt[0] = d->field_order_cnt_list[i][0];
@@ -412,8 +412,8 @@ nvc0_decoder_fill_picparm_h264_vp(struct nvc0_decoder *dec,
static void
nvc0_decoder_fill_picparm_h264_vp_refs(struct nvc0_decoder *dec,
struct pipe_h264_picture_desc *d,
- struct nvc0_video_buffer *refs[16],
- struct nvc0_video_buffer *target,
+ struct nouveau_vp3_video_buffer *refs[16],
+ struct nouveau_vp3_video_buffer *target,
char *map)
{
struct h264_picparm_vp *h = (struct h264_picparm_vp *)map;
@@ -431,7 +431,7 @@ nvc0_decoder_fill_picparm_h264_vp_refs(struct nvc0_decoder *dec,
static uint32_t
nvc0_decoder_fill_picparm_vc1_vp(struct nvc0_decoder *dec,
struct pipe_vc1_picture_desc *d,
- struct nvc0_video_buffer *refs[16],
+ struct nouveau_vp3_video_buffer *refs[16],
unsigned *is_ref,
char *map)
{
@@ -455,8 +455,8 @@ nvc0_decoder_fill_picparm_vc1_vp(struct nvc0_decoder *dec,
vc->overlap = d->overlap;
vc->quantizer = d->quantizer;
vc->u36 = 0; // ? No idea what this one is..
- refs[0] = (struct nvc0_video_buffer *)d->ref[0];
- refs[!!refs[0]] = (struct nvc0_video_buffer *)d->ref[1];
+ refs[0] = (struct nouveau_vp3_video_buffer *)d->ref[0];
+ refs[!!refs[0]] = (struct nouveau_vp3_video_buffer *)d->ref[1];
return 0x12;
}
@@ -494,9 +494,9 @@ static void dump_comm_vp(struct nvc0_decoder *dec, struct comm *comm, u32 comm_s
#endif
void nvc0_decoder_vp_caps(struct nvc0_decoder *dec, union pipe_desc desc,
- struct nvc0_video_buffer *target, unsigned comm_seq,
+ struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
unsigned *caps, unsigned *is_ref,
- struct nvc0_video_buffer *refs[16])
+ struct nouveau_vp3_video_buffer *refs[16])
{
struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NVC0_VIDEO_QDEPTH];
enum pipe_video_codec codec = u_reduce_video_profile(dec->base.profile);
@@ -528,9 +528,9 @@ void nvc0_decoder_vp_caps(struct nvc0_decoder *dec, union pipe_desc desc,
void
nvc0_decoder_vp(struct nvc0_decoder *dec, union pipe_desc desc,
- struct nvc0_video_buffer *target, unsigned comm_seq,
+ struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
unsigned caps, unsigned is_ref,
- struct nvc0_video_buffer *refs[16])
+ struct nouveau_vp3_video_buffer *refs[16])
{
struct nouveau_pushbuf *push = dec->pushbuf[1];
uint32_t bsp_addr, comm_addr, inter_addr, ucode_addr, pic_addr[17], last_addr, null_addr;