aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-10-31 17:20:27 +0100
committeremersion <contact@emersion.fr>2018-11-04 09:00:51 +0100
commit62d646f2b8b560ce9b64e6a840ac7bdc8d60bbb8 (patch)
tree93ade3587593f8e17ef1ddaab19b934edc4604e7 /include
parent675cf8457ef3493112def366d7090731172ee872 (diff)
render/gles2: remove assumptions about supported formats
We were assuming GL_BGRA_EXT was always supported. We now check that it's supported for rendering. We fail if it isn't because this format is specified as "always supported" by the Wayland protocol. We also check if it's supported for reading pixels. A new preferred_read_format function returns the preferred format that can be used to read pixels. This is used by the screencopy protocol.
Diffstat (limited to 'include')
-rw-r--r--include/render/gles2.h9
-rw-r--r--include/wlr/render/interface.h5
-rw-r--r--include/wlr/render/wlr_renderer.h5
3 files changed, 16 insertions, 3 deletions
diff --git a/include/render/gles2.h b/include/render/gles2.h
index 7ff2f174..063ed20a 100644
--- a/include/render/gles2.h
+++ b/include/render/gles2.h
@@ -40,6 +40,11 @@ struct wlr_gles2_renderer {
const char *exts_str;
struct {
+ bool read_format_bgra_ext;
+ bool debug_khr;
+ } exts;
+
+ struct {
struct {
GLuint program;
GLint proj;
@@ -87,7 +92,9 @@ struct wlr_gles2_texture {
const struct wlr_gles2_pixel_format *get_gles2_format_from_wl(
enum wl_shm_format fmt);
-const enum wl_shm_format *get_gles2_formats(size_t *len);
+const struct wlr_gles2_pixel_format *get_gles2_format_from_gl(
+ GLint gl_format, GLint gl_type, bool alpha);
+const enum wl_shm_format *get_gles2_wl_formats(size_t *len);
struct wlr_gles2_texture *gles2_get_texture(
struct wlr_texture *wlr_texture);
diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h
index 905d419f..6b80a077 100644
--- a/include/wlr/render/interface.h
+++ b/include/wlr/render/interface.h
@@ -34,6 +34,8 @@ struct wlr_renderer_impl {
const float color[static 4], const float matrix[static 9]);
const enum wl_shm_format *(*formats)(
struct wlr_renderer *renderer, size_t *len);
+ bool (*format_supported)(struct wlr_renderer *renderer,
+ enum wl_shm_format fmt);
bool (*resource_is_wl_drm_buffer)(struct wlr_renderer *renderer,
struct wl_resource *resource);
void (*wl_drm_buffer_get_size)(struct wlr_renderer *renderer,
@@ -41,12 +43,11 @@ struct wlr_renderer_impl {
int (*get_dmabuf_formats)(struct wlr_renderer *renderer, int **formats);
int (*get_dmabuf_modifiers)(struct wlr_renderer *renderer, int format,
uint64_t **modifiers);
+ enum wl_shm_format (*preferred_read_format)(struct wlr_renderer *renderer);
bool (*read_pixels)(struct wlr_renderer *renderer, enum wl_shm_format fmt,
uint32_t *flags, uint32_t stride, uint32_t width, uint32_t height,
uint32_t src_x, uint32_t src_y, uint32_t dst_x, uint32_t dst_y,
void *data);
- bool (*format_supported)(struct wlr_renderer *renderer,
- enum wl_shm_format fmt);
struct wlr_texture *(*texture_from_pixels)(struct wlr_renderer *renderer,
enum wl_shm_format fmt, uint32_t stride, uint32_t width,
uint32_t height, const void *data);
diff --git a/include/wlr/render/wlr_renderer.h b/include/wlr/render/wlr_renderer.h
index 9c031b7f..02b4a11e 100644
--- a/include/wlr/render/wlr_renderer.h
+++ b/include/wlr/render/wlr_renderer.h
@@ -97,6 +97,11 @@ int wlr_renderer_get_dmabuf_formats(struct wlr_renderer *renderer,
int wlr_renderer_get_dmabuf_modifiers(struct wlr_renderer *renderer, int format,
uint64_t **modifiers);
/**
+ * Get the preferred format for reading pixels.
+ */
+bool wlr_renderer_preferred_read_format(struct wlr_renderer *renderer,
+ enum wl_shm_format *fmt);
+/**
* Reads out of pixels of the currently bound surface into data. `stride` is in
* bytes.
*