diff --git a/src/graphics/canvas.h b/src/graphics/canvas.h index 6b069293..05577fdb 100644 --- a/src/graphics/canvas.h +++ b/src/graphics/canvas.h @@ -24,7 +24,7 @@ typedef struct { typedef struct Canvas Canvas; Canvas* lovrCanvasCreate(int width, int height, CanvasFlags flags); -Canvas* lovrCanvasCreateFromHandle(int width, int height, CanvasFlags flags, uint32_t handle, int attachmentCount); +Canvas* lovrCanvasCreateFromHandle(int width, int height, CanvasFlags flags, uint32_t handle, int attachmentCount, bool immortal); void lovrCanvasDestroy(void* ref); const Attachment* lovrCanvasGetAttachments(Canvas* canvas, int* count); void lovrCanvasSetAttachments(Canvas* canvas, Attachment* attachments, int count); diff --git a/src/graphics/opengl.c b/src/graphics/opengl.c index 2524cf6c..8e89b80e 100644 --- a/src/graphics/opengl.c +++ b/src/graphics/opengl.c @@ -135,6 +135,7 @@ struct Canvas { int attachmentCount; bool needsAttach; bool needsResolve; + bool immortal; }; typedef struct { @@ -1232,7 +1233,7 @@ Canvas* lovrCanvasCreate(int width, int height, CanvasFlags flags) { return canvas; } -Canvas* lovrCanvasCreateFromHandle(int width, int height, CanvasFlags flags, uint32_t handle, int attachmentCount) { +Canvas* lovrCanvasCreateFromHandle(int width, int height, CanvasFlags flags, uint32_t handle, int attachmentCount, bool immortal) { Canvas* canvas = lovrAlloc(Canvas, lovrCanvasDestroy); if (!canvas) return NULL; @@ -1241,15 +1242,18 @@ Canvas* lovrCanvasCreateFromHandle(int width, int height, CanvasFlags flags, uin canvas->width = width; canvas->height = height; canvas->flags = flags; + canvas->immortal = immortal; return canvas; } void lovrCanvasDestroy(void* ref) { Canvas* canvas = ref; - glDeleteFramebuffers(1, &canvas->framebuffer); - glDeleteRenderbuffers(1, &canvas->depthBuffer); - glDeleteFramebuffers(1, &canvas->resolveBuffer); + if (!canvas->immortal) { + glDeleteFramebuffers(1, &canvas->framebuffer); + glDeleteRenderbuffers(1, &canvas->depthBuffer); + glDeleteFramebuffers(1, &canvas->resolveBuffer); + } for (int i = 0; i < canvas->attachmentCount; i++) { lovrRelease(canvas->attachments[i].texture); } diff --git a/src/headset/oculus_mobile.c b/src/headset/oculus_mobile.c index a7497c02..dae201ef 100644 --- a/src/headset/oculus_mobile.c +++ b/src/headset/oculus_mobile.c @@ -10,8 +10,10 @@ static void (*renderCallback)(void*); static void* renderUserdata; void lovrOculusMobileDraw(int framebuffer, int width, int height, float *eyeViewMatrix, float *projectionMatrix) { + lovrGpuDirtyTexture(); + CanvasFlags flags = {0}; - Canvas *canvas = lovrCanvasCreateFromHandle(width, height, flags, framebuffer, 1); + Canvas *canvas = lovrCanvasCreateFromHandle(width, height, flags, framebuffer, 1, true); Camera camera = { .canvas = canvas, .stereo = false }; memcpy(camera.viewMatrix[0], eyeViewMatrix, sizeof(camera.viewMatrix[0]));