summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/queue_tiger.c43
-rw-r--r--src/render/queue_tiger.h3
-rw-r--r--src/render/renderer.h1
-rw-r--r--src/render/renderer_libplacebo.c8
-rw-r--r--src/render/renderer_tiger.c9
5 files changed, 51 insertions, 13 deletions
diff --git a/src/render/queue_tiger.c b/src/render/queue_tiger.c
index b1c34ca..bbc2b6e 100644
--- a/src/render/queue_tiger.c
+++ b/src/render/queue_tiger.c
@@ -3,7 +3,7 @@
#include "queue_tiger.h"
-static void upload_texture(struct camu_frame_queue_tiger *tq, struct camu_codec_frame *frame)
+static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, s32 width, s32 height, s32 format, s32 linesize)
{
glGenTextures(1, &tq->texture_id);
glActiveTexture(GL_TEXTURE0);
@@ -15,19 +15,16 @@ static void upload_texture(struct camu_frame_queue_tiger *tq, struct camu_codec_
//if (frame->flags & CAMU_FRAME_DEVICE_ALLOCATED) {
// glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tq->tr->texture_buffer);
//}
- //if (linesize) {
- // glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize);
- //}
- //glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- switch (frame->format) {
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, linesize);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 0);
+ switch (format) {
case CAMU_PIXEL_FORMAT_RGBA:
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frame->width, frame->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, frame->data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
break;
case CAMU_PIXEL_FORMAT_RGB:
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, frame->width, frame->height, 0,
- GL_RGB, GL_UNSIGNED_BYTE, frame->data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height,
+ 0, GL_RGB, GL_UNSIGNED_BYTE, data);
break;
default:
al_assert(false);
@@ -47,6 +44,7 @@ static void queue_tiger_push_av_frame(struct camu_frame_queue *queue, AVFrame *f
{
struct camu_frame_queue_tiger *tq = (struct camu_frame_queue_tiger *)queue;
(void)pts;
+ tq->queued_av_frame = frame;
}
#endif
@@ -68,10 +66,30 @@ static u8 queue_tiger_read(struct camu_frame_queue *queue, f64 pts, void *out)
(void)pts;
if (tq->queued_frame) {
struct camu_codec_frame *frame = tq->queued_frame;
- upload_texture(tq, frame);
+ s32 linesize = frame->video.width;
+ upload_texture(tq, frame->data, frame->video.width, frame->video.height, frame->format, linesize);
+ camu_codec_frame_discard(frame);
tq->queued_frame = NULL;
tq->uploaded = true;
}
+#ifdef CAMU_HAVE_FFMPEG
+ if (tq->queued_av_frame) {
+ AVFrame *frame = tq->queued_av_frame;
+ s32 linesize = frame->linesize[0];
+ switch (frame->format) {
+ case CAMU_PIXEL_FORMAT_RGBA:
+ linesize /= 4;
+ break;
+ case CAMU_PIXEL_FORMAT_RGB:
+ linesize /= 3;
+ break;
+ }
+ upload_texture(tq, frame->data[0], frame->width, frame->height, frame->format, linesize);
+ av_frame_free(&frame);
+ tq->queued_av_frame = NULL;
+ tq->uploaded = true;
+ }
+#endif
if (!tq->uploaded) return CAMU_QUEUE_MORE;
*((GLuint *)out) = tq->texture_id;
return CAMU_QUEUE_OK;
@@ -95,6 +113,7 @@ struct camu_frame_queue *camu_frame_queue_tiger_create(void)
{
struct camu_frame_queue_tiger *tq = al_alloc_object(struct camu_frame_queue_tiger);
tq->queued_frame = NULL;
+ tq->queued_av_frame = NULL;
tq->uploaded = false;
tq->q.push = queue_tiger_push;
#ifdef CAMU_HAVE_FFMPEG
diff --git a/src/render/queue_tiger.h b/src/render/queue_tiger.h
index a90d8c7..af0e229 100644
--- a/src/render/queue_tiger.h
+++ b/src/render/queue_tiger.h
@@ -9,6 +9,9 @@ struct camu_frame_queue_tiger {
GLuint texture_id;
struct camu_renderer_tiger *tr;
struct camu_codec_frame *queued_frame;
+#ifdef CAMU_HAVE_FFMPEG
+ struct AVFrame *queued_av_frame;
+#endif
bool uploaded;
};
diff --git a/src/render/renderer.h b/src/render/renderer.h
index 5b1d342..dcd74c1 100644
--- a/src/render/renderer.h
+++ b/src/render/renderer.h
@@ -31,6 +31,7 @@ struct camu_renderer {
#endif
void *priv);
struct camu_frame_queue *(*create_queue)(struct camu_renderer *);
+ u32 (*get_latency)(struct camu_renderer *);
void (*resize)(struct camu_renderer *, s32 *, s32 *);
void (*render)(struct camu_renderer *, struct camu_screen *);
#ifdef CAMU_HAVE_FFMPEG
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 8dde7f5..4f64fc2 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -116,6 +116,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid
}
lr->swapchain = pl_opengl_create_swapchain(lr->gl, pl_opengl_swapchain_params(
+ .max_swapchain_depth = 2,
.swap_buffers = gl_swap_buffers,
.priv = priv
));
@@ -184,6 +185,12 @@ static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *r
return queue;
}
+static u32 renderer_lp_get_latency(struct camu_renderer *renderer)
+{
+ struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer;
+ return (u32)pl_swapchain_latency(lr->swapchain);
+}
+
static void renderer_lp_render(struct camu_renderer *renderer, struct camu_screen *scr)
{
struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer;
@@ -257,6 +264,7 @@ struct camu_renderer *camu_renderer_lp_create(void)
struct camu_renderer_lp *lr = al_alloc_object(struct camu_renderer_lp);
lr->r.create_renderer = renderer_lp_create_renderer;
lr->r.create_queue = renderer_lp_create_queue;
+ lr->r.get_latency = renderer_lp_get_latency;
lr->r.resize = renderer_lp_resize;
lr->r.render = renderer_lp_render;
lr->r.free = renderer_lp_free;
diff --git a/src/render/renderer_tiger.c b/src/render/renderer_tiger.c
index 7127891..74d9238 100644
--- a/src/render/renderer_tiger.c
+++ b/src/render/renderer_tiger.c
@@ -174,6 +174,12 @@ static struct camu_frame_queue *renderer_tiger_create_queue(struct camu_renderer
#endif
}
+static u32 renderer_tiger_get_latency(struct camu_renderer *renderer)
+{
+ (void)renderer;
+ return 0;
+}
+
static void set_uniform(struct camu_renderer_tiger *tr, const GLchar *name,
u8 type, void *value)
{
@@ -229,7 +235,7 @@ static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_sc
glActiveTexture(GL_TEXTURE0);
#ifdef CAMU_SCREEN_THREADED
- if (al_atomic_bool_load(&scr->queued, AL_ATOMIC_RELAXED)) {
+ if (al_atomic_load(u8)(&scr->queued, AL_ATOMIC_RELAXED)) {
camu_screen_run_queue(scr);
}
#endif
@@ -297,6 +303,7 @@ struct camu_renderer *camu_renderer_tiger_create(void)
struct camu_renderer_tiger *tr = al_alloc_object(struct camu_renderer_tiger);
tr->r.create_renderer = renderer_tiger_create_renderer;
tr->r.create_queue = renderer_tiger_create_queue;
+ tr->r.get_latency = renderer_tiger_get_latency;
tr->r.resize = renderer_tiger_resize;
tr->r.render = renderer_tiger_render;
tr->r.get_device_ptr = renderer_tiger_get_device_ptr;