mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
Mesa: update vdpau_interop patches
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
6bc01f988a
commit
9de68c4ef9
@ -1,44 +0,0 @@
|
||||
From 42a34d19fd3891cdbe0d41482288ebba5dfddc64 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sat, 21 Sep 2013 13:21:47 +0200
|
||||
Subject: [PATCH 1/5] winsys/radeon: fix killing the CS thread
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Kill the thread only after we checked that it's not used any more, not before.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
index 69c42a0..0a3b932 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
@@ -421,6 +421,10 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
||||
{
|
||||
struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws;
|
||||
|
||||
+ if (!pipe_reference(&ws->base.reference, NULL)) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (ws->thread) {
|
||||
ws->kill_thread = 1;
|
||||
pipe_semaphore_signal(&ws->cs_queued);
|
||||
@@ -429,10 +433,6 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
||||
pipe_semaphore_destroy(&ws->cs_queued);
|
||||
pipe_condvar_destroy(ws->cs_queue_empty);
|
||||
|
||||
- if (!pipe_reference(&ws->base.reference, NULL)) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
pipe_mutex_destroy(ws->hyperz_owner_mutex);
|
||||
pipe_mutex_destroy(ws->cmask_owner_mutex);
|
||||
pipe_mutex_destroy(ws->cs_stack_lock);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,104 +0,0 @@
|
||||
From 295eb75d53547fa7dcc6b188e423debbba1888ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sat, 21 Sep 2013 15:24:55 +0200
|
||||
Subject: [PATCH 2/5] winsys/radeon: remove cs_queue_empty
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Waiting for an empty queue is nonsense and can lead to deadlocks if we have
|
||||
multiple waiters or another thread that continuously sends down new commands.
|
||||
|
||||
Just post the cs to the queue and immediately wait for it to finish.
|
||||
|
||||
This is a candidate for the stable branch.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 11 +++--------
|
||||
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 6 ------
|
||||
src/gallium/winsys/radeon/drm/radeon_drm_winsys.h | 5 -----
|
||||
3 files changed, 3 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
|
||||
index 38a9209..d530011 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
|
||||
@@ -560,17 +560,12 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs, unsigned flags, ui
|
||||
break;
|
||||
}
|
||||
|
||||
- if (cs->ws->thread && (flags & RADEON_FLUSH_ASYNC)) {
|
||||
+ if (cs->ws->thread) {
|
||||
cs->flush_started = 1;
|
||||
radeon_drm_ws_queue_cs(cs->ws, cs);
|
||||
+ if (!(flags & RADEON_FLUSH_ASYNC))
|
||||
+ radeon_drm_cs_sync_flush(rcs);
|
||||
} else {
|
||||
- pipe_mutex_lock(cs->ws->cs_stack_lock);
|
||||
- if (cs->ws->thread) {
|
||||
- while (p_atomic_read(&cs->ws->ncs)) {
|
||||
- pipe_condvar_wait(cs->ws->cs_queue_empty, cs->ws->cs_stack_lock);
|
||||
- }
|
||||
- }
|
||||
- pipe_mutex_unlock(cs->ws->cs_stack_lock);
|
||||
radeon_drm_cs_emit_ioctl_oneshot(cs, cs->cst);
|
||||
}
|
||||
} else {
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
index 0a3b932..27bf348 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
@@ -431,7 +431,6 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
||||
pipe_thread_wait(ws->thread);
|
||||
}
|
||||
pipe_semaphore_destroy(&ws->cs_queued);
|
||||
- pipe_condvar_destroy(ws->cs_queue_empty);
|
||||
|
||||
pipe_mutex_destroy(ws->hyperz_owner_mutex);
|
||||
pipe_mutex_destroy(ws->cmask_owner_mutex);
|
||||
@@ -567,9 +566,6 @@ next:
|
||||
}
|
||||
ws->cs_stack[p_atomic_read(&ws->ncs) - 1] = NULL;
|
||||
empty_stack = p_atomic_dec_zero(&ws->ncs);
|
||||
- if (empty_stack) {
|
||||
- pipe_condvar_signal(ws->cs_queue_empty);
|
||||
- }
|
||||
pipe_mutex_unlock(ws->cs_stack_lock);
|
||||
|
||||
pipe_semaphore_signal(&cs->flush_completed);
|
||||
@@ -585,7 +581,6 @@ next:
|
||||
ws->cs_stack[i] = NULL;
|
||||
}
|
||||
p_atomic_set(&ws->ncs, 0);
|
||||
- pipe_condvar_signal(ws->cs_queue_empty);
|
||||
pipe_mutex_unlock(ws->cs_stack_lock);
|
||||
return NULL;
|
||||
}
|
||||
@@ -651,7 +646,6 @@ struct radeon_winsys *radeon_drm_winsys_create(int fd)
|
||||
|
||||
p_atomic_set(&ws->ncs, 0);
|
||||
pipe_semaphore_init(&ws->cs_queued, 0);
|
||||
- pipe_condvar_init(ws->cs_queue_empty);
|
||||
if (ws->num_cpus > 1 && debug_get_option_thread())
|
||||
ws->thread = pipe_thread_create(radeon_drm_cs_emit_ioctl, ws);
|
||||
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
|
||||
index 682479e..ed90194 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
|
||||
@@ -67,11 +67,6 @@ struct radeon_drm_winsys {
|
||||
/* rings submission thread */
|
||||
pipe_mutex cs_stack_lock;
|
||||
pipe_semaphore cs_queued;
|
||||
- /* we cannot use semaphore for empty queue because maintaining an even
|
||||
- * number of call to semaphore_wait and semaphore_signal is, to say the
|
||||
- * least, tricky
|
||||
- */
|
||||
- pipe_condvar cs_queue_empty;
|
||||
pipe_thread thread;
|
||||
int kill_thread;
|
||||
int ncs;
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,59 +0,0 @@
|
||||
From ab56fbbdb774eeffb232a6995fe350dd6d44ff55 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sat, 21 Sep 2013 12:25:13 +0200
|
||||
Subject: [PATCH 3/5] winsys/radeon: share winsys between different fd's
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Share the winsys between different fd's if they point to the same device.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
index 27bf348..61f0913 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
@@ -41,6 +41,9 @@
|
||||
|
||||
#include <xf86drm.h>
|
||||
#include <stdio.h>
|
||||
+#include <sys/types.h>
|
||||
+#include <sys/stat.h>
|
||||
+#include <unistd.h>
|
||||
|
||||
/*
|
||||
* this are copy from radeon_drm, once an updated libdrm is released
|
||||
@@ -519,12 +522,24 @@ static uint64_t radeon_query_value(struct radeon_winsys *rws,
|
||||
|
||||
static unsigned hash_fd(void *key)
|
||||
{
|
||||
- return pointer_to_intptr(key);
|
||||
+ int fd = pointer_to_intptr(key);
|
||||
+ struct stat stat;
|
||||
+ fstat(fd, &stat);
|
||||
+
|
||||
+ return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
|
||||
}
|
||||
|
||||
static int compare_fd(void *key1, void *key2)
|
||||
{
|
||||
- return pointer_to_intptr(key1) != pointer_to_intptr(key2);
|
||||
+ int fd1 = pointer_to_intptr(key1);
|
||||
+ int fd2 = pointer_to_intptr(key2);
|
||||
+ struct stat stat1, stat2;
|
||||
+ fstat(fd1, &stat1);
|
||||
+ fstat(fd2, &stat2);
|
||||
+
|
||||
+ return stat1.st_dev != stat2.st_dev ||
|
||||
+ stat1.st_ino != stat2.st_ino ||
|
||||
+ stat1.st_rdev != stat2.st_rdev;
|
||||
}
|
||||
|
||||
void radeon_drm_ws_queue_cs(struct radeon_drm_winsys *ws, struct radeon_drm_cs *cs)
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,31 +0,0 @@
|
||||
From 1ee590c6f238b638d663af889201d584239b7f73 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sat, 21 Sep 2013 15:34:38 +0200
|
||||
Subject: [PATCH 5/5] radeon/uvd: async flush the UVD cs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
No need to block for the CS thread here.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/drivers/radeon/radeon_uvd.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
index 518978e..fa81105 100644
|
||||
--- a/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
@@ -110,7 +110,7 @@ static void flush(struct ruvd_decoder *dec)
|
||||
while(dec->cs->cdw % 16)
|
||||
pm4[dec->cs->cdw++] = RUVD_PKT2();
|
||||
|
||||
- dec->ws->cs_flush(dec->cs, 0, 0);
|
||||
+ dec->ws->cs_flush(dec->cs, RADEON_FLUSH_ASYNC, 0);
|
||||
}
|
||||
|
||||
/* add a new set register command to the IB */
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,53 @@
|
||||
From a1e9f01ef29e803b2eb10e53c342db702a2cdccf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sun, 22 Sep 2013 10:41:27 +0200
|
||||
Subject: [PATCH 5/9] radeon/uvd: move alignment to winsys
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Similar to GFX and DMA.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/drivers/radeon/radeon_uvd.c | 6 ------
|
||||
src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 6 ++++++
|
||||
2 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
index fa81105..a8b17e6 100644
|
||||
--- a/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
@@ -104,12 +104,6 @@ static unsigned alloc_stream_handle()
|
||||
/* flush IB to the hardware */
|
||||
static void flush(struct ruvd_decoder *dec)
|
||||
{
|
||||
- uint32_t *pm4 = dec->cs->buf;
|
||||
-
|
||||
- // align IB
|
||||
- while(dec->cs->cdw % 16)
|
||||
- pm4[dec->cs->cdw++] = RUVD_PKT2();
|
||||
-
|
||||
dec->ws->cs_flush(dec->cs, RADEON_FLUSH_ASYNC, 0);
|
||||
}
|
||||
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
|
||||
index d530011..62f7704 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
|
||||
@@ -494,6 +494,12 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs, unsigned flags, ui
|
||||
OUT_CS(&cs->base, 0x80000000); /* type2 nop packet */
|
||||
}
|
||||
break;
|
||||
+ case RING_UVD:
|
||||
+ while (rcs->cdw & 15)
|
||||
+ OUT_CS(&cs->base, 0x80000000); /* type2 nop packet */
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
}
|
||||
|
||||
if (rcs->cdw > RADEON_MAX_CMDBUF_DWORDS) {
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,103 @@
|
||||
From 760a3a7e464d1506ffbeaf8719abaa26d6bd0c03 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sun, 22 Sep 2013 12:16:20 +0200
|
||||
Subject: [PATCH 6/9] st/vdpau: use a separate lock per decoder
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/state_trackers/vdpau/decode.c | 20 +++++++++++---------
|
||||
src/gallium/state_trackers/vdpau/vdpau_private.h | 1 +
|
||||
2 files changed, 12 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/gallium/state_trackers/vdpau/decode.c b/src/gallium/state_trackers/vdpau/decode.c
|
||||
index b144b83..9a96a33 100644
|
||||
--- a/src/gallium/state_trackers/vdpau/decode.c
|
||||
+++ b/src/gallium/state_trackers/vdpau/decode.c
|
||||
@@ -130,6 +130,8 @@ vlVdpDecoderCreate(VdpDevice device,
|
||||
ret = VDP_STATUS_ERROR;
|
||||
goto error_handle;
|
||||
}
|
||||
+
|
||||
+ pipe_mutex_init(vldecoder->mutex);
|
||||
pipe_mutex_unlock(dev->mutex);
|
||||
|
||||
return VDP_STATUS_OK;
|
||||
@@ -155,9 +157,10 @@ vlVdpDecoderDestroy(VdpDecoder decoder)
|
||||
if (!vldecoder)
|
||||
return VDP_STATUS_INVALID_HANDLE;
|
||||
|
||||
- pipe_mutex_lock(vldecoder->device->mutex);
|
||||
+ pipe_mutex_lock(vldecoder->mutex);
|
||||
vldecoder->decoder->destroy(vldecoder->decoder);
|
||||
- pipe_mutex_unlock(vldecoder->device->mutex);
|
||||
+ pipe_mutex_unlock(vldecoder->mutex);
|
||||
+ pipe_mutex_destroy(vldecoder->mutex);
|
||||
|
||||
vlRemoveDataHTAB(decoder);
|
||||
FREE(vldecoder);
|
||||
@@ -478,8 +481,6 @@ vlVdpDecoderRender(VdpDecoder decoder,
|
||||
// TODO: Recreate decoder with correct chroma
|
||||
return VDP_STATUS_INVALID_CHROMA_TYPE;
|
||||
|
||||
- pipe_mutex_lock(vlsurf->device->mutex);
|
||||
-
|
||||
buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
|
||||
PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
|
||||
buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
|
||||
@@ -490,6 +491,8 @@ vlVdpDecoderRender(VdpDecoder decoder,
|
||||
dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
|
||||
!buffer_support[vlsurf->video_buffer->interlaced]) {
|
||||
|
||||
+ pipe_mutex_lock(vlsurf->device->mutex);
|
||||
+
|
||||
/* destroy the old one */
|
||||
if (vlsurf->video_buffer)
|
||||
vlsurf->video_buffer->destroy(vlsurf->video_buffer);
|
||||
@@ -511,6 +514,7 @@ vlVdpDecoderRender(VdpDecoder decoder,
|
||||
return VDP_STATUS_NO_IMPLEMENTATION;
|
||||
}
|
||||
vlVdpVideoSurfaceClear(vlsurf);
|
||||
+ pipe_mutex_unlock(vlsurf->device->mutex);
|
||||
}
|
||||
|
||||
for (i = 0; i < bitstream_buffer_count; ++i) {
|
||||
@@ -536,18 +540,16 @@ vlVdpDecoderRender(VdpDecoder decoder,
|
||||
ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info);
|
||||
break;
|
||||
default:
|
||||
- pipe_mutex_unlock(vlsurf->device->mutex);
|
||||
return VDP_STATUS_INVALID_DECODER_PROFILE;
|
||||
}
|
||||
|
||||
- if (ret != VDP_STATUS_OK) {
|
||||
- pipe_mutex_unlock(vlsurf->device->mutex);
|
||||
+ if (ret != VDP_STATUS_OK)
|
||||
return ret;
|
||||
- }
|
||||
|
||||
+ pipe_mutex_lock(vldecoder->mutex);
|
||||
dec->begin_frame(dec, vlsurf->video_buffer, &desc.base);
|
||||
dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes);
|
||||
dec->end_frame(dec, vlsurf->video_buffer, &desc.base);
|
||||
- pipe_mutex_unlock(vlsurf->device->mutex);
|
||||
+ pipe_mutex_unlock(vldecoder->mutex);
|
||||
return ret;
|
||||
}
|
||||
diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h
|
||||
index 54545fe..0812767 100644
|
||||
--- a/src/gallium/state_trackers/vdpau/vdpau_private.h
|
||||
+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
|
||||
@@ -387,6 +387,7 @@ typedef struct
|
||||
typedef struct
|
||||
{
|
||||
vlVdpDevice *device;
|
||||
+ pipe_mutex mutex;
|
||||
struct pipe_video_codec *decoder;
|
||||
} vlVdpDecoder;
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,479 @@
|
||||
From 43fc7abc4ec27aa99fbfb0e72fa4ff6bb4663b0f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sun, 22 Sep 2013 13:18:30 +0200
|
||||
Subject: [PATCH 7/9] radeon/winsys: keep screen pointer in winsys
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Only create one screen for each winsys instance.
|
||||
This helps with buffer sharing and interop handling.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/drivers/r300/r300_screen.c | 3 +++
|
||||
src/gallium/drivers/r600/r600_pipe.c | 3 +++
|
||||
src/gallium/drivers/radeonsi/radeonsi_pipe.c | 3 +++
|
||||
src/gallium/targets/dri-r300/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/dri-r600/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/dri-radeonsi/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/vdpau-r300/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/vdpau-r600/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/vdpau-radeonsi/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/xorg-r600/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/xorg-radeonsi/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/xvmc-r300/target.c | 13 ++++++++-----
|
||||
src/gallium/targets/xvmc-r600/target.c | 13 ++++++++-----
|
||||
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 4 ----
|
||||
src/gallium/winsys/radeon/drm/radeon_winsys.h | 5 +++++
|
||||
15 files changed, 94 insertions(+), 54 deletions(-)
|
||||
|
||||
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
|
||||
index 063bc09..45a815a 100644
|
||||
--- a/src/gallium/drivers/r300/r300_screen.c
|
||||
+++ b/src/gallium/drivers/r300/r300_screen.c
|
||||
@@ -540,6 +540,9 @@ static void r300_destroy_screen(struct pipe_screen* pscreen)
|
||||
struct r300_screen* r300screen = r300_screen(pscreen);
|
||||
struct radeon_winsys *rws = radeon_winsys(pscreen);
|
||||
|
||||
+ if (rws && !pipe_reference(&rws->reference, NULL))
|
||||
+ return;
|
||||
+
|
||||
pipe_mutex_destroy(r300screen->cmask_mutex);
|
||||
|
||||
if (rws)
|
||||
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
|
||||
index 50ff06c..4dee37b 100644
|
||||
--- a/src/gallium/drivers/r600/r600_pipe.c
|
||||
+++ b/src/gallium/drivers/r600/r600_pipe.c
|
||||
@@ -958,6 +958,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen)
|
||||
if (rscreen == NULL)
|
||||
return;
|
||||
|
||||
+ if (!pipe_reference(&rscreen->b.ws->reference, NULL))
|
||||
+ return;
|
||||
+
|
||||
pipe_mutex_destroy(rscreen->aux_context_lock);
|
||||
rscreen->aux_context->destroy(rscreen->aux_context);
|
||||
|
||||
diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
|
||||
index 138268c..8529380 100644
|
||||
--- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
|
||||
+++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
|
||||
@@ -648,6 +648,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen)
|
||||
if (rscreen == NULL)
|
||||
return;
|
||||
|
||||
+ if (!pipe_reference(&rscreen->b.ws->reference, NULL))
|
||||
+ return;
|
||||
+
|
||||
if (rscreen->fences.bo) {
|
||||
struct r600_fence_block *entry, *tmp;
|
||||
|
||||
diff --git a/src/gallium/targets/dri-r300/target.c b/src/gallium/targets/dri-r300/target.c
|
||||
index 07b0705..d363885 100644
|
||||
--- a/src/gallium/targets/dri-r300/target.c
|
||||
+++ b/src/gallium/targets/dri-r300/target.c
|
||||
@@ -1,25 +1,28 @@
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r300/r300_public.h"
|
||||
|
||||
static struct pipe_screen *
|
||||
create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *sws;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
sws = radeon_drm_winsys_create(fd);
|
||||
if (!sws)
|
||||
return NULL;
|
||||
|
||||
- screen = r300_screen_create(sws);
|
||||
- if (!screen)
|
||||
+ if (sws->screen)
|
||||
+ return sws->screen;
|
||||
+
|
||||
+ sws->screen = r300_screen_create(sws);
|
||||
+ if (!sws->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ sws->screen = debug_screen_wrap(sws->screen);
|
||||
|
||||
- return screen;
|
||||
+ return sws->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/targets/dri-r600/target.c b/src/gallium/targets/dri-r600/target.c
|
||||
index 9bff6f2..3fc4422 100644
|
||||
--- a/src/gallium/targets/dri-r600/target.c
|
||||
+++ b/src/gallium/targets/dri-r600/target.c
|
||||
@@ -1,24 +1,27 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r600/r600_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
- screen = r600_screen_create(radeon);
|
||||
- if (!screen)
|
||||
+ if (radeon->screen)
|
||||
+ return radeon->screen;
|
||||
+
|
||||
+ radeon->screen = r600_screen_create(radeon);
|
||||
+ if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
|
||||
- return screen;
|
||||
+ return radeon->screen;
|
||||
}
|
||||
|
||||
static const struct drm_conf_ret throttle_ret = {
|
||||
diff --git a/src/gallium/targets/dri-radeonsi/target.c b/src/gallium/targets/dri-radeonsi/target.c
|
||||
index 1350ba2..a294633 100644
|
||||
--- a/src/gallium/targets/dri-radeonsi/target.c
|
||||
+++ b/src/gallium/targets/dri-radeonsi/target.c
|
||||
@@ -1,24 +1,27 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "radeonsi/radeonsi_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
- screen = radeonsi_screen_create(radeon);
|
||||
- if (!screen)
|
||||
+ if (radeon->screen)
|
||||
+ return radeon->screen;
|
||||
+
|
||||
+ radeon->screen = radeonsi_screen_create(radeon);
|
||||
+ if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
|
||||
- return screen;
|
||||
+ return radeon->screen;
|
||||
}
|
||||
|
||||
static const struct drm_conf_ret throttle_ret = {
|
||||
diff --git a/src/gallium/targets/vdpau-r300/target.c b/src/gallium/targets/vdpau-r300/target.c
|
||||
index 2fd7c2f..042e080 100644
|
||||
--- a/src/gallium/targets/vdpau-r300/target.c
|
||||
+++ b/src/gallium/targets/vdpau-r300/target.c
|
||||
@@ -1,24 +1,27 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r300/r300_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
- screen = r300_screen_create(radeon);
|
||||
- if (!screen)
|
||||
+ if (radeon->screen)
|
||||
+ return radeon->screen;
|
||||
+
|
||||
+ radeon->screen = r300_screen_create(radeon);
|
||||
+ if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
|
||||
- return screen;
|
||||
+ return radeon->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/targets/vdpau-r600/target.c b/src/gallium/targets/vdpau-r600/target.c
|
||||
index 3b7795b..b51c6af 100644
|
||||
--- a/src/gallium/targets/vdpau-r600/target.c
|
||||
+++ b/src/gallium/targets/vdpau-r600/target.c
|
||||
@@ -1,24 +1,27 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r600/r600_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
- screen = r600_screen_create(radeon);
|
||||
- if (!screen)
|
||||
+ if (radeon->screen)
|
||||
+ return radeon->screen;
|
||||
+
|
||||
+ radeon->screen = r600_screen_create(radeon);
|
||||
+ if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
|
||||
- return screen;
|
||||
+ return radeon->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("r600", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/targets/vdpau-radeonsi/target.c b/src/gallium/targets/vdpau-radeonsi/target.c
|
||||
index ffb6662..4d0b9e9 100644
|
||||
--- a/src/gallium/targets/vdpau-radeonsi/target.c
|
||||
+++ b/src/gallium/targets/vdpau-radeonsi/target.c
|
||||
@@ -1,24 +1,27 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "radeonsi/radeonsi_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
- screen = radeonsi_screen_create(radeon);
|
||||
- if (!screen)
|
||||
+ if (radeon->screen)
|
||||
+ return radeon->screen;
|
||||
+
|
||||
+ radeon->screen = radeonsi_screen_create(radeon);
|
||||
+ if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
|
||||
- return screen;
|
||||
+ return radeon->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("radeonsi", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/targets/xorg-r600/target.c b/src/gallium/targets/xorg-r600/target.c
|
||||
index 75785da..81b5488 100644
|
||||
--- a/src/gallium/targets/xorg-r600/target.c
|
||||
+++ b/src/gallium/targets/xorg-r600/target.c
|
||||
@@ -2,25 +2,28 @@
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r600/r600_public.h"
|
||||
|
||||
static struct pipe_screen *
|
||||
create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *sws;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
sws = radeon_drm_winsys_create(fd);
|
||||
if (!sws)
|
||||
return NULL;
|
||||
|
||||
- screen = r600_screen_create(sws);
|
||||
- if (!screen)
|
||||
+ if (sws->screen)
|
||||
+ return sws->screen;
|
||||
+
|
||||
+ sws->screen = r600_screen_create(sws);
|
||||
+ if (!sws->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ sws->screen = debug_screen_wrap(sws->screen);
|
||||
|
||||
- return screen;
|
||||
+ return sws->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("r600", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/targets/xorg-radeonsi/target.c b/src/gallium/targets/xorg-radeonsi/target.c
|
||||
index c023c68..6e618ad 100644
|
||||
--- a/src/gallium/targets/xorg-radeonsi/target.c
|
||||
+++ b/src/gallium/targets/xorg-radeonsi/target.c
|
||||
@@ -2,25 +2,28 @@
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "radeonsi/radeonsi_public.h"
|
||||
|
||||
static struct pipe_screen *
|
||||
create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *sws;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
sws = radeon_drm_winsys_create(fd);
|
||||
if (!sws)
|
||||
return NULL;
|
||||
|
||||
- screen = radeonsi_screen_create(sws);
|
||||
- if (!screen)
|
||||
+ if (sws->screen)
|
||||
+ return sws->screen;
|
||||
+
|
||||
+ sws->screen = radeonsi_screen_create(sws);
|
||||
+ if (!sws->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ sws->screen = debug_screen_wrap(sws->screen);
|
||||
|
||||
- return screen;
|
||||
+ return sws->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("radeonsi", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/targets/xvmc-r300/target.c b/src/gallium/targets/xvmc-r300/target.c
|
||||
index 2fd7c2f..042e080 100644
|
||||
--- a/src/gallium/targets/xvmc-r300/target.c
|
||||
+++ b/src/gallium/targets/xvmc-r300/target.c
|
||||
@@ -1,24 +1,27 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r300/r300_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
- screen = r300_screen_create(radeon);
|
||||
- if (!screen)
|
||||
+ if (radeon->screen)
|
||||
+ return radeon->screen;
|
||||
+
|
||||
+ radeon->screen = r300_screen_create(radeon);
|
||||
+ if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
|
||||
- return screen;
|
||||
+ return radeon->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/targets/xvmc-r600/target.c b/src/gallium/targets/xvmc-r600/target.c
|
||||
index 3b7795b..b51c6af 100644
|
||||
--- a/src/gallium/targets/xvmc-r600/target.c
|
||||
+++ b/src/gallium/targets/xvmc-r600/target.c
|
||||
@@ -1,24 +1,27 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
+#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r600/r600_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
- struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
- screen = r600_screen_create(radeon);
|
||||
- if (!screen)
|
||||
+ if (radeon->screen)
|
||||
+ return radeon->screen;
|
||||
+
|
||||
+ radeon->screen = r600_screen_create(radeon);
|
||||
+ if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
- screen = debug_screen_wrap(screen);
|
||||
+ radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
|
||||
- return screen;
|
||||
+ return radeon->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("r600", "radeon", create_screen, NULL)
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
index 61f0913..4f43093 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
|
||||
@@ -424,10 +424,6 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
||||
{
|
||||
struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws;
|
||||
|
||||
- if (!pipe_reference(&ws->base.reference, NULL)) {
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
if (ws->thread) {
|
||||
ws->kill_thread = 1;
|
||||
pipe_semaphore_signal(&ws->cs_queued);
|
||||
diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h
|
||||
index 1367982..7ed2437 100644
|
||||
--- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
|
||||
+++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
|
||||
@@ -208,6 +208,11 @@ struct radeon_winsys {
|
||||
struct pipe_reference reference;
|
||||
|
||||
/**
|
||||
+ * The screen object this winsys was created for
|
||||
+ */
|
||||
+ struct pipe_screen *screen;
|
||||
+
|
||||
+ /**
|
||||
* Destroy this winsys.
|
||||
*
|
||||
* \param ws The winsys this function is called from.
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -0,0 +1,40 @@
|
||||
From e5e2ed6a6f05200cfa8652cd9dff046d1c2c485d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Sun, 22 Sep 2013 15:59:17 +0200
|
||||
Subject: [PATCH 8/9] radeon/uvd: try to place msg/fb buffer into GART
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This is only supported on NI+, but the kernel takes care of those limitations.
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/drivers/radeon/radeon_uvd.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
index a8b17e6..382b410 100644
|
||||
--- a/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
|
||||
@@ -148,7 +148,7 @@ static void send_msg(struct ruvd_decoder *dec, struct ruvd_msg *msg)
|
||||
|
||||
/* and send it to the hardware */
|
||||
send_cmd(dec, RUVD_CMD_MSG_BUFFER, buf->cs_handle, 0,
|
||||
- RADEON_USAGE_READ, RADEON_DOMAIN_VRAM);
|
||||
+ RADEON_USAGE_READ, RADEON_DOMAIN_GTT);
|
||||
}
|
||||
|
||||
/* create a buffer in the winsys */
|
||||
@@ -794,7 +794,7 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder,
|
||||
send_cmd(dec, RUVD_CMD_DECODING_TARGET_BUFFER, dt, 0,
|
||||
RADEON_USAGE_WRITE, RADEON_DOMAIN_VRAM);
|
||||
send_cmd(dec, RUVD_CMD_FEEDBACK_BUFFER, msg_fb_buf->cs_handle,
|
||||
- 0x1000, RADEON_USAGE_WRITE, RADEON_DOMAIN_VRAM);
|
||||
+ 0x1000, RADEON_USAGE_WRITE, RADEON_DOMAIN_GTT);
|
||||
set_reg(dec, RUVD_ENGINE_CNTL, 1);
|
||||
|
||||
flush(dec);
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,7 +1,7 @@
|
||||
From a51bdb6ea7bd9ac99d035253bf217e1bd7ac2efc Mon Sep 17 00:00:00 2001
|
||||
From b9c03e373b1771055527ca2917139ed1ac171350 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
|
||||
Date: Wed, 15 May 2013 15:10:11 +0200
|
||||
Subject: [PATCH 4/5] implement NV_vdpau_interop v3
|
||||
Subject: [PATCH 9/9] implement NV_vdpau_interop v4
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -12,6 +12,8 @@ v2: Actually implement interop between the gallium
|
||||
v3: Make it also available in non legacy contexts,
|
||||
fix video buffer sharing.
|
||||
|
||||
v4: deny interop if we don't have the same screen object
|
||||
|
||||
Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
---
|
||||
src/gallium/include/state_tracker/vdpau_interop.h | 49 ++++
|
||||
@ -31,9 +33,9 @@ Signed-off-by: Christian König <christian.koenig@amd.com>
|
||||
src/mesa/main/vdpau.h | 72 ++++++
|
||||
src/mesa/state_tracker/st_context.c | 3 +
|
||||
src/mesa/state_tracker/st_extensions.c | 1 +
|
||||
src/mesa/state_tracker/st_vdpau.c | 193 +++++++++++++++
|
||||
src/mesa/state_tracker/st_vdpau.c | 181 ++++++++++++++
|
||||
src/mesa/state_tracker/st_vdpau.h | 42 ++++
|
||||
19 files changed, 800 insertions(+), 9 deletions(-)
|
||||
19 files changed, 788 insertions(+), 9 deletions(-)
|
||||
create mode 100644 src/gallium/include/state_tracker/vdpau_interop.h
|
||||
create mode 100644 src/mapi/glapi/gen/NV_vdpau_interop.xml
|
||||
create mode 100644 src/mesa/main/vdpau.c
|
||||
@ -199,7 +201,7 @@ index 8e39d68..dd434aa 100644
|
||||
+ return p_surf->video_buffer;
|
||||
+}
|
||||
diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h
|
||||
index 54545fe..fe3bc3e 100644
|
||||
index 0812767..dffc7aa 100644
|
||||
--- a/src/gallium/state_trackers/vdpau/vdpau_private.h
|
||||
+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
|
||||
@@ -36,6 +36,8 @@
|
||||
@ -211,7 +213,7 @@ index 54545fe..fe3bc3e 100644
|
||||
#include "util/u_debug.h"
|
||||
#include "util/u_rect.h"
|
||||
#include "os/os_thread.h"
|
||||
@@ -474,6 +476,10 @@ VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
|
||||
@@ -475,6 +477,10 @@ VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
|
||||
VdpVideoMixerDestroy vlVdpVideoMixerDestroy;
|
||||
VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix;
|
||||
|
||||
@ -815,10 +817,10 @@ index 97dd732..2898a8d 100644
|
||||
ctx->Extensions.OES_EGL_image_external = GL_TRUE;
|
||||
diff --git a/src/mesa/state_tracker/st_vdpau.c b/src/mesa/state_tracker/st_vdpau.c
|
||||
new file mode 100644
|
||||
index 0000000..c6ca909
|
||||
index 0000000..406df0f
|
||||
--- /dev/null
|
||||
+++ b/src/mesa/state_tracker/st_vdpau.c
|
||||
@@ -0,0 +1,193 @@
|
||||
@@ -0,0 +1,181 @@
|
||||
+/**************************************************************************
|
||||
+ *
|
||||
+ * Copyright 2013 Advanced Micro Devices, Inc.
|
||||
@ -860,7 +862,6 @@ index 0000000..c6ca909
|
||||
+#include "pipe/p_state.h"
|
||||
+#include "pipe/p_video_codec.h"
|
||||
+
|
||||
+#include "state_tracker/drm_driver.h"
|
||||
+#include "state_tracker/vdpau_interop.h"
|
||||
+
|
||||
+#include "util/u_inlines.h"
|
||||
@ -903,19 +904,6 @@ index 0000000..c6ca909
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* do we have different screen objects ? */
|
||||
+ if (res->screen != st->pipe->screen) {
|
||||
+ struct winsys_handle handle;
|
||||
+
|
||||
+ /* export the resource from the other context */
|
||||
+ memset(&handle, 0, sizeof(handle));
|
||||
+ handle.type = DRM_API_HANDLE_TYPE_SHARED;
|
||||
+ res->screen->resource_get_handle(res->screen, res, &handle);
|
||||
+
|
||||
+ /* and import it into this one */
|
||||
+ res = st->pipe->screen->resource_from_handle(st->pipe->screen, res, &handle);
|
||||
+ }
|
||||
+
|
||||
+ } else {
|
||||
+ VdpVideoSurfaceGallium *f;
|
||||
+
|
||||
@ -946,10 +934,6 @@ index 0000000..c6ca909
|
||||
+ }
|
||||
+
|
||||
+ res = sv->texture;
|
||||
+
|
||||
+ /* In theory we also need to reimport the buffer into the new screen,
|
||||
+ but that currently isn't specified. Just using the resource
|
||||
+ as it is does indeed seem to work.*/
|
||||
+ }
|
||||
+
|
||||
+ if (!res) {
|
||||
@ -957,6 +941,12 @@ index 0000000..c6ca909
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* do we have different screen objects ? */
|
||||
+ if (res->screen != st->pipe->screen) {
|
||||
+ _mesa_error(ctx, GL_INVALID_OPERATION, "VDPAUMapSurfacesNV");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* switch to surface based */
|
||||
+ if (!stObj->surface_based) {
|
||||
+ _mesa_clear_texture_object(ctx, texObj);
|
Loading…
x
Reference in New Issue
Block a user