mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-21 06:46:46 -04:00
render: add wlr_renderer_get_time()
This queries the current GPU time. [1]: https://registry.khronos.org/OpenGL/extensions/EXT/EXT_disjoint_timer_query.txt References: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3025
This commit is contained in:
parent
c07424411a
commit
b4765809b5
5 changed files with 45 additions and 0 deletions
|
|
@ -32,6 +32,10 @@ struct wlr_gles2_tex_shader {
|
||||||
GLint tex_attrib;
|
GLint tex_attrib;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Fixed here, but missing from any libglvnd release:
|
||||||
|
// https://gitlab.freedesktop.org/glvnd/libglvnd/-/merge_requests/268
|
||||||
|
typedef void (GL_APIENTRYP PFNGLGETINTEGER64VEXTPROC) (GLenum pname, GLint64 *data);
|
||||||
|
|
||||||
struct wlr_gles2_renderer {
|
struct wlr_gles2_renderer {
|
||||||
struct wlr_renderer wlr_renderer;
|
struct wlr_renderer wlr_renderer;
|
||||||
|
|
||||||
|
|
@ -48,6 +52,7 @@ struct wlr_gles2_renderer {
|
||||||
bool EXT_texture_type_2_10_10_10_REV;
|
bool EXT_texture_type_2_10_10_10_REV;
|
||||||
bool OES_texture_half_float_linear;
|
bool OES_texture_half_float_linear;
|
||||||
bool EXT_texture_norm16;
|
bool EXT_texture_norm16;
|
||||||
|
bool EXT_disjoint_timer_query;
|
||||||
} exts;
|
} exts;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
@ -57,6 +62,7 @@ struct wlr_gles2_renderer {
|
||||||
PFNGLPOPDEBUGGROUPKHRPROC glPopDebugGroupKHR;
|
PFNGLPOPDEBUGGROUPKHRPROC glPopDebugGroupKHR;
|
||||||
PFNGLPUSHDEBUGGROUPKHRPROC glPushDebugGroupKHR;
|
PFNGLPUSHDEBUGGROUPKHRPROC glPushDebugGroupKHR;
|
||||||
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES;
|
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES;
|
||||||
|
PFNGLGETINTEGER64VEXTPROC glGetInteger64vEXT;
|
||||||
} procs;
|
} procs;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ struct wlr_renderer_impl {
|
||||||
uint32_t (*get_render_buffer_caps)(struct wlr_renderer *renderer);
|
uint32_t (*get_render_buffer_caps)(struct wlr_renderer *renderer);
|
||||||
struct wlr_texture *(*texture_from_buffer)(struct wlr_renderer *renderer,
|
struct wlr_texture *(*texture_from_buffer)(struct wlr_renderer *renderer,
|
||||||
struct wlr_buffer *buffer);
|
struct wlr_buffer *buffer);
|
||||||
|
bool (*get_time)(struct wlr_renderer *r, struct timespec *t);
|
||||||
};
|
};
|
||||||
|
|
||||||
void wlr_renderer_init(struct wlr_renderer *renderer,
|
void wlr_renderer_init(struct wlr_renderer *renderer,
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@
|
||||||
#include <wlr/backend.h>
|
#include <wlr/backend.h>
|
||||||
#include <wlr/render/wlr_texture.h>
|
#include <wlr/render/wlr_texture.h>
|
||||||
|
|
||||||
|
struct timespec;
|
||||||
|
|
||||||
struct wlr_renderer_impl;
|
struct wlr_renderer_impl;
|
||||||
struct wlr_drm_format_set;
|
struct wlr_drm_format_set;
|
||||||
struct wlr_buffer;
|
struct wlr_buffer;
|
||||||
|
|
@ -112,6 +114,11 @@ bool wlr_renderer_init_wl_shm(struct wlr_renderer *r,
|
||||||
*/
|
*/
|
||||||
int wlr_renderer_get_drm_fd(struct wlr_renderer *r);
|
int wlr_renderer_get_drm_fd(struct wlr_renderer *r);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current GPU time.
|
||||||
|
*/
|
||||||
|
bool wlr_renderer_get_time(struct wlr_renderer *r, struct timespec *t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroys the renderer.
|
* Destroys the renderer.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
#include "render/gles2.h"
|
#include "render/gles2.h"
|
||||||
#include "render/pixel_format.h"
|
#include "render/pixel_format.h"
|
||||||
#include "types/wlr_matrix.h"
|
#include "types/wlr_matrix.h"
|
||||||
|
#include "util/time.h"
|
||||||
|
|
||||||
static const GLfloat verts[] = {
|
static const GLfloat verts[] = {
|
||||||
1, 0, // top right
|
1, 0, // top right
|
||||||
|
|
@ -485,6 +486,23 @@ struct wlr_egl *wlr_gles2_renderer_get_egl(struct wlr_renderer *wlr_renderer) {
|
||||||
return renderer->egl;
|
return renderer->egl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool gles2_get_time(struct wlr_renderer *wlr_renderer, struct timespec *t) {
|
||||||
|
struct wlr_gles2_renderer *renderer =
|
||||||
|
gles2_get_renderer_in_context(wlr_renderer);
|
||||||
|
|
||||||
|
if (!renderer->exts.EXT_disjoint_timer_query) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLint64 nsec = 0;
|
||||||
|
push_gles2_debug(renderer);
|
||||||
|
renderer->procs.glGetInteger64vEXT(GL_TIMESTAMP_EXT, &nsec);
|
||||||
|
pop_gles2_debug(renderer);
|
||||||
|
|
||||||
|
timespec_from_nsec(t, nsec);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
|
static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
|
||||||
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
|
||||||
|
|
||||||
|
|
@ -539,6 +557,7 @@ static const struct wlr_renderer_impl renderer_impl = {
|
||||||
.get_drm_fd = gles2_get_drm_fd,
|
.get_drm_fd = gles2_get_drm_fd,
|
||||||
.get_render_buffer_caps = gles2_get_render_buffer_caps,
|
.get_render_buffer_caps = gles2_get_render_buffer_caps,
|
||||||
.texture_from_buffer = gles2_texture_from_buffer,
|
.texture_from_buffer = gles2_texture_from_buffer,
|
||||||
|
.get_time = gles2_get_time,
|
||||||
};
|
};
|
||||||
|
|
||||||
void push_gles2_debug_(struct wlr_gles2_renderer *renderer,
|
void push_gles2_debug_(struct wlr_gles2_renderer *renderer,
|
||||||
|
|
@ -768,6 +787,11 @@ struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
|
||||||
"glEGLImageTargetRenderbufferStorageOES");
|
"glEGLImageTargetRenderbufferStorageOES");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (check_gl_ext(exts_str, "GL_EXT_disjoint_timer_query")) {
|
||||||
|
renderer->exts.EXT_disjoint_timer_query = true;
|
||||||
|
load_gl_proc(&renderer->procs.glGetInteger64vEXT, "glGetInteger64vEXT");
|
||||||
|
}
|
||||||
|
|
||||||
if (renderer->exts.KHR_debug) {
|
if (renderer->exts.KHR_debug) {
|
||||||
glEnable(GL_DEBUG_OUTPUT_KHR);
|
glEnable(GL_DEBUG_OUTPUT_KHR);
|
||||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR);
|
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR);
|
||||||
|
|
|
||||||
|
|
@ -433,3 +433,10 @@ int wlr_renderer_get_drm_fd(struct wlr_renderer *r) {
|
||||||
}
|
}
|
||||||
return r->impl->get_drm_fd(r);
|
return r->impl->get_drm_fd(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wlr_renderer_get_time(struct wlr_renderer *r, struct timespec *t) {
|
||||||
|
if (!r->impl->get_time) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return r->impl->get_time(r, t);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue