Skip to content

Commit

Permalink
Merge branch 'main' into wlr_scene_blur
Browse files Browse the repository at this point in the history
  • Loading branch information
ErikReider committed Apr 15, 2024
2 parents de4ec10 + e1f4bc5 commit 7634dbf
Show file tree
Hide file tree
Showing 23 changed files with 726 additions and 335 deletions.
12 changes: 6 additions & 6 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
default = pkgs.mkShell {
name = "scenefx-shell";

inputsFrom = [ pkgs.wlroots_0_16 ];
inputsFrom = [ pkgs.wlroots_0_17 ];

nativeBuildInputs = with pkgs; [
cmake
Expand All @@ -40,7 +40,7 @@
shellHook = with pkgs; ''(
mkdir -p "$PWD/subprojects"
cd "$PWD/subprojects"
cp -R --no-preserve=mode,ownership ${wlroots_0_16.src} wlroots
cp -R --no-preserve=mode,ownership ${wlroots_0_17.src} wlroots
)'';
};
});
Expand Down
84 changes: 1 addition & 83 deletions include/render/fx_renderer/fx_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#define _FX_OPENGL_H

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <scenefx/render/fx_renderer/fx_renderer.h>
#include <stdbool.h>
#include <time.h>
#include <wlr/render/egl.h>
Expand All @@ -11,8 +11,6 @@
#include <wlr/util/addon.h>
#include <wlr/util/box.h>

#include "render/fx_renderer/shaders.h"

struct fx_pixel_format {
uint32_t drm_format;
// optional field, if empty then internalformat = format
Expand Down Expand Up @@ -83,94 +81,14 @@ struct fx_texture {
struct wlr_addon buffer_addon;
};

struct fx_texture_attribs {
GLenum target; /* either GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES */
GLuint tex;

bool has_alpha;
};

struct fx_texture *fx_get_texture(struct wlr_texture *wlr_texture);

struct wlr_texture *fx_texture_from_buffer(struct wlr_renderer *wlr_renderer,
struct wlr_buffer *buffer);

void fx_texture_destroy(struct fx_texture *texture);

bool wlr_texture_is_fx(struct wlr_texture *wlr_texture);

void fx_texture_get_attribs(struct wlr_texture *texture,
struct fx_texture_attribs *attribs);

///
/// fx_renderer
///

struct fx_renderer {
struct wlr_renderer wlr_renderer;

float projection[9];
struct wlr_egl *egl;
int drm_fd;

const char *exts_str;
struct {
bool EXT_read_format_bgra;
bool KHR_debug;
bool OES_egl_image_external;
bool OES_egl_image;
bool EXT_texture_type_2_10_10_10_REV;
bool OES_texture_half_float_linear;
bool EXT_texture_norm16;
bool EXT_disjoint_timer_query;
} exts;

struct {
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR;
PFNGLDEBUGMESSAGECONTROLKHRPROC glDebugMessageControlKHR;
PFNGLPOPDEBUGGROUPKHRPROC glPopDebugGroupKHR;
PFNGLPUSHDEBUGGROUPKHRPROC glPushDebugGroupKHR;
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES;
PFNGLGETGRAPHICSRESETSTATUSKHRPROC glGetGraphicsResetStatusKHR;
PFNGLGENQUERIESEXTPROC glGenQueriesEXT;
PFNGLDELETEQUERIESEXTPROC glDeleteQueriesEXT;
PFNGLQUERYCOUNTEREXTPROC glQueryCounterEXT;
PFNGLGETQUERYOBJECTIVEXTPROC glGetQueryObjectivEXT;
PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64vEXT;
PFNGLGETINTEGER64VEXTPROC glGetInteger64vEXT;
} procs;

struct {
struct quad_shader quad;
struct tex_shader tex_rgba;
struct tex_shader tex_rgbx;
struct tex_shader tex_ext;
struct box_shadow_shader box_shadow;
struct stencil_mask_shader stencil_mask;
struct blur_shader blur1;
struct blur_shader blur2;
struct blur_effects_shader blur_effects;
} shaders;

struct wl_list buffers; // fx_framebuffer.link
struct wl_list textures; // fx_texture.link

struct fx_framebuffer *current_buffer;
uint32_t viewport_width, viewport_height;

// Set to true when 'wlr_renderer_begin_buffer_pass' is called instead of
// our custom 'fx_renderer_begin_buffer_pass' function
bool basic_renderer;

// The region where there's blur
pixman_region32_t blur_padding_region;
};

bool wlr_renderer_is_fx(struct wlr_renderer *wlr_renderer);

struct fx_renderer *fx_get_renderer(
struct wlr_renderer *wlr_renderer);
struct fx_render_timer *fx_get_render_timer(
struct wlr_render_timer *timer);
struct fx_texture *fx_get_texture(
Expand Down
41 changes: 40 additions & 1 deletion include/render/fx_renderer/shaders.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ enum fx_tex_shader_source {
SHADER_SOURCE_TEXTURE_EXTERNAL = 3,
};

enum fx_rounded_quad_shader_source {
SHADER_SOURCE_QUAD_ROUND = 1,
SHADER_SOURCE_QUAD_ROUND_TOP_LEFT = 2,
SHADER_SOURCE_QUAD_ROUND_TOP_RIGHT = 3,
SHADER_SOURCE_QUAD_ROUND_BOTTOM_RIGHT = 4,
SHADER_SOURCE_QUAD_ROUND_BOTTOM_LEFT = 5,
};

struct quad_shader {
GLuint program;
GLint proj;
Expand All @@ -29,6 +37,18 @@ struct quad_shader {

bool link_quad_program(struct quad_shader *shader);

struct quad_round_shader {
GLuint program;
GLint proj;
GLint color;
GLint pos_attrib;
GLint size;
GLint position;
GLint radius;
};

bool link_quad_round_program(struct quad_round_shader *shader, enum fx_rounded_quad_shader_source source);

struct tex_shader {
GLuint program;
GLint proj;
Expand All @@ -39,16 +59,35 @@ struct tex_shader {
GLint size;
GLint position;
GLint radius;
GLint has_titlebar;
GLint discard_transparent;
GLint dim;
GLint dim_color;
};

bool link_tex_program(struct tex_shader *shader, enum fx_tex_shader_source source);

struct stencil_mask_shader {
struct rounded_border_corner_shader {
GLuint program;
GLint proj;
GLint color;
GLint pos_attrib;
GLint is_top_left;
GLint is_top_right;
GLint is_bottom_left;
GLint is_bottom_right;
GLint position;
GLint radius;
GLint half_size;
GLint half_thickness;
};

bool link_rounded_border_corner_program(struct rounded_border_corner_shader *shader);

struct stencil_mask_shader {
GLuint program;
GLint proj;
GLint pos_attrib;
GLint half_size;
GLint position;
GLint radius;
Expand Down
88 changes: 7 additions & 81 deletions include/render/pass.h
Original file line number Diff line number Diff line change
@@ -1,103 +1,29 @@
#ifndef FX_RENDER_PASS_H
#define FX_RENDER_PASS_H

#include <scenefx/render/pass.h>
#include <stdbool.h>
#include <wlr/render/pass.h>
#include <wlr/util/box.h>
#include <wlr/render/interface.h>
#include "render/fx_renderer/fx_effect_framebuffers.h"
#include "scenefx/types/fx/shadow_data.h"

struct fx_gles_render_pass {
struct wlr_render_pass base;
struct fx_framebuffer *buffer;
struct fx_effect_framebuffers *fx_effect_framebuffers;
float projection_matrix[9];
struct fx_render_timer *timer;
};

/**
* Begin a new render pass with the supplied destination buffer.
*
* Callers must call wlr_render_pass_submit() once they are done with the
* render pass.
*/
struct fx_gles_render_pass *fx_renderer_begin_buffer_pass(struct wlr_renderer *wlr_renderer,
struct wlr_buffer *wlr_buffer, struct wlr_output *output,
const struct wlr_buffer_pass_options *options);

struct fx_render_texture_options {
struct wlr_render_texture_options base;
float scale;
struct wlr_box *clip_box; // Used to clip csd. Ignored if NULL
int corner_radius;
bool discard_transparent;
};

struct fx_render_texture_options fx_render_texture_options_default(
const struct wlr_render_texture_options *base);

struct fx_render_rect_options {
struct wlr_render_rect_options base;
float scale;
};

struct fx_render_rect_options fx_render_rect_options_default(
const struct wlr_render_rect_options *base);

struct fx_render_blur_pass_options {
struct fx_render_texture_options tex_options;
pixman_region32_t *opaque_region;
struct wlr_output *output;
struct wlr_box monitor_box;
struct fx_framebuffer *current_buffer;
struct blur_data *blur_data;
bool use_optimized_blur;
bool ignore_transparent;
struct fx_render_stencil_box_options {
struct wlr_box box;
/* Clip region, leave NULL to disable clipping */
const pixman_region32_t *clip;
int corner_radius;
};

/**
* Render a fx texture.
*/
void fx_render_pass_add_texture(struct fx_gles_render_pass *render_pass,
const struct fx_render_texture_options *options);

/**
* Render a rectangle.
*/
void fx_render_pass_add_rect(struct fx_gles_render_pass *render_pass,
const struct fx_render_rect_options *options);

/**
* Render a stencil mask.
*/
void fx_render_pass_add_stencil_mask(struct fx_gles_render_pass *pass,
const struct fx_render_rect_options *fx_options, int corner_radius);

/**
* Render a box shadow.
*/
void fx_render_pass_add_box_shadow(struct fx_gles_render_pass *pass,
const struct fx_render_rect_options *fx_options,
int corner_radius, struct shadow_data *shadow_data);

/**
* Render blur.
*/
void fx_render_pass_add_blur(struct fx_gles_render_pass *pass,
struct fx_render_blur_pass_options *fx_options);

/**
* Render optimized blur.
*/
void fx_render_pass_add_optimized_blur(struct fx_gles_render_pass *pass,
struct fx_render_blur_pass_options *fx_options);

/**
* Render from one buffer to another
*/
void fx_renderer_read_to_buffer(struct fx_gles_render_pass *pass,
pixman_region32_t *region, struct fx_framebuffer *dst_buffer,
struct fx_framebuffer *src_buffer);
const struct fx_render_stencil_box_options *options);

#endif
9 changes: 0 additions & 9 deletions include/scenefx/fx_renderer/fx_renderer.h

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
#include <wlr/types/wlr_output.h>
#include <wlr/util/addon.h>

#include "render/fx_renderer/fx_renderer.h"

/**
* Used to add effect framebuffers per output instead of every output sharing
* them.
Expand All @@ -26,7 +24,6 @@ struct fx_effect_framebuffers {
bool blur_buffer_dirty;
};

struct fx_effect_framebuffers *fx_effect_framebuffers_try_get(
struct fx_renderer *renderer, struct wlr_output *output);
struct fx_effect_framebuffers *fx_effect_framebuffers_try_get(struct wlr_output *output);

#endif
Loading

0 comments on commit 7634dbf

Please sign in to comment.