Merge branch 'wip/otte/for-main' into 'main'

gpu: Don't run long loops in shaders

See merge request GNOME/gtk!7495
This commit is contained in:
Benjamin Otte 2024-07-25 20:42:55 +00:00
commit efc6d15dde
9 changed files with 72 additions and 14 deletions

View File

@ -1779,7 +1779,7 @@ static const GdkDrmFormatInfo supported_formats[] = {
.download = NULL, .download = NULL,
#ifdef GDK_RENDERING_VULKAN #ifdef GDK_RENDERING_VULKAN
.vk = { .vk = {
.format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, .format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,
.swizzle = VULKAN_DEFAULT_SWIZZLE, .swizzle = VULKAN_DEFAULT_SWIZZLE,
}, },
#endif #endif
@ -1791,7 +1791,7 @@ static const GdkDrmFormatInfo supported_formats[] = {
.download = download_p010, .download = download_p010,
#ifdef GDK_RENDERING_VULKAN #ifdef GDK_RENDERING_VULKAN
.vk = { .vk = {
.format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, .format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
.swizzle = VULKAN_DEFAULT_SWIZZLE, .swizzle = VULKAN_DEFAULT_SWIZZLE,
}, },
#endif #endif
@ -1803,7 +1803,7 @@ static const GdkDrmFormatInfo supported_formats[] = {
.download = download_p010, .download = download_p010,
#ifdef GDK_RENDERING_VULKAN #ifdef GDK_RENDERING_VULKAN
.vk = { .vk = {
.format = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, .format = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,
.swizzle = VULKAN_DEFAULT_SWIZZLE, .swizzle = VULKAN_DEFAULT_SWIZZLE,
}, },
#endif #endif
@ -1815,7 +1815,7 @@ static const GdkDrmFormatInfo supported_formats[] = {
.download = download_p010, .download = download_p010,
#ifdef GDK_RENDERING_VULKAN #ifdef GDK_RENDERING_VULKAN
.vk = { .vk = {
.format = VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, .format = VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
.swizzle = VULKAN_DEFAULT_SWIZZLE, .swizzle = VULKAN_DEFAULT_SWIZZLE,
}, },
#endif #endif

View File

@ -534,7 +534,7 @@ gdk_registry_handle_global (void *data,
&wp_presentation_interface, &wp_presentation_interface,
MIN (version, 1)); MIN (version, 1));
} }
else if (strcmp (interface, "xx_color_manager_v2") == 0) else if (strcmp (interface, "xx_color_manager_v4") == 0)
{ {
display_wayland->color = gdk_wayland_color_new (registry, id, version); display_wayland->color = gdk_wayland_color_new (registry, id, version);
} }

View File

@ -643,7 +643,8 @@ gdk_wayland_color_get_image_description (GdkWaylandColor *color,
for (int i = 0; i < color->image_descs->len; i++) for (int i = 0; i < color->image_descs->len; i++)
{ {
ImageDescEntry *e = &g_array_index (color->image_descs, ImageDescEntry, i); ImageDescEntry *e = &g_array_index (color->image_descs, ImageDescEntry, i);
if (e->cp == normalized.color_primaries && e->tf == normalized.transfer_function) if (wl_to_cicp_primaries (e->cp) == normalized.color_primaries &&
wl_to_cicp_transfer (e->tf) == normalized.transfer_function)
return e->desc; return e->desc;
} }

View File

@ -302,8 +302,9 @@ prepend_line_numbers (char *code)
} }
static gboolean static gboolean
gsk_gl_device_check_shader_error (int shader_id, gsk_gl_device_check_shader_error (const char *name,
GError **error) int shader_id,
GError **error)
{ {
GLint status; GLint status;
GLint log_len; GLint log_len;
@ -329,13 +330,14 @@ gsk_gl_device_check_shader_error (int shader_id,
g_set_error (error, g_set_error (error,
GDK_GL_ERROR, GDK_GL_ERROR,
GDK_GL_ERROR_COMPILATION_FAILED, GDK_GL_ERROR_COMPILATION_FAILED,
"Compilation failure in shader.\n" "Compilation failure in shader %s.\n"
"Source Code:\n" "Source Code:\n"
"%s\n" "%s\n"
"\n" "\n"
"Error Message:\n" "Error Message:\n"
"%s\n" "%s\n"
"\n", "\n",
name,
code, code,
log); log);
@ -454,7 +456,7 @@ gsk_gl_device_load_shader (GskGLDevice *self,
print_shader_info (shader_type == GL_FRAGMENT_SHADER ? "fragment" : "vertex", shader_id, program_name); print_shader_info (shader_type == GL_FRAGMENT_SHADER ? "fragment" : "vertex", shader_id, program_name);
if (!gsk_gl_device_check_shader_error (shader_id, error)) if (!gsk_gl_device_check_shader_error (program_name, shader_id, error))
{ {
glDeleteShader (shader_id); glDeleteShader (shader_id);
return 0; return 0;

View File

@ -35,6 +35,7 @@ uniform PushConstants
#ifdef GSK_TEXTURE0_IS_EXTERNAL #ifdef GSK_TEXTURE0_IS_EXTERNAL
uniform samplerExternalOES GSK_TEXTURE0; uniform samplerExternalOES GSK_TEXTURE0;
#define HAS_EXTERNAL_TEXTURES
#else #else
uniform sampler2D GSK_TEXTURE0; uniform sampler2D GSK_TEXTURE0;
#endif #endif
@ -43,6 +44,9 @@ uniform sampler2D GSK_TEXTURE0;
#ifdef GSK_TEXTURE1_IS_EXTERNAL #ifdef GSK_TEXTURE1_IS_EXTERNAL
uniform samplerExternalOES GSK_TEXTURE1; uniform samplerExternalOES GSK_TEXTURE1;
#ifndef HAS_EXTERNAL_TEXTURES
#define HAS_EXTERNAL_TEXTURES
#endif
#else #else
uniform sampler2D GSK_TEXTURE1; uniform sampler2D GSK_TEXTURE1;
#endif #endif
@ -50,6 +54,30 @@ uniform sampler2D GSK_TEXTURE1;
#endif #endif
#endif #endif
#ifdef HAS_EXTERNAL_TEXTURES
vec4
gsk_texture_straight_alpha (samplerExternalOES tex,
vec2 pos)
{
vec2 size = vec2 (textureSize (tex, 0));
pos *= size;
size -= vec2 (1.0);
/* GL_CLAMP_TO_EDGE */
pos = clamp (pos - 0.5, vec2 (0.0), size);
ivec2 ipos = ivec2 (pos);
pos = fract (pos);
vec4 tl = texelFetch (tex, ipos, 0);
tl.rgb *= tl.a;
vec4 tr = texelFetch (tex, ipos + ivec2(1, 0), 0);
tr.rgb *= tr.a;
vec4 bl = texelFetch (tex, ipos + ivec2(0, 1), 0);
bl.rgb *= bl.a;
vec4 br = texelFetch (tex, ipos + ivec2(1, 1), 0);
br.rgb *= br.a;
return mix (mix (tl, tr, pos.x), mix (bl, br, pos.x), pos.y);
}
#endif
layout(location = 0) out vec4 out_color; layout(location = 0) out vec4 out_color;
void void
gsk_set_output_color (vec4 color) gsk_set_output_color (vec4 color)

View File

@ -7,9 +7,13 @@ void main_clip_rounded (void);
#include "enums.glsl" #include "enums.glsl"
/* Needs to be exactly like this and not use #else
* because our include script is too dumb
*/
#ifdef VULKAN #ifdef VULKAN
#include "common-vulkan.glsl" #include "common-vulkan.glsl"
#else #endif /* VULKAN */
#ifndef VULKAN
#include "common-gl.glsl" #include "common-gl.glsl"
#endif #endif

View File

@ -112,7 +112,7 @@ blur_corner (vec2 p,
return 0.0; return 0.0;
float result = 0.0; float result = 0.0;
float step = 1.0; float step = max (1.0, r.y / 8.0);
for (float y = 0.5 * step; y <= r.y; y += step) for (float y = 0.5 * step; y <= r.y; y += step)
{ {
float x = r.x - ellipse_x (r, r.y - y); float x = r.x - ellipse_x (r, r.y - y);

View File

@ -6,17 +6,37 @@ import os
loaded_files = [] loaded_files = []
check_defines = [ 'VULKAN' ]
def load (path): def load (path):
if (path in loaded_files): if (path in loaded_files):
return return
loaded_files.append (path) loaded_files.append (path)
skipping = ''
with open(path) as f: with open(path) as f:
lines = f.readlines() lines = f.readlines()
for line in lines: for line in lines:
if skipping:
match = re.search (r"^#endif /\* (.*) \*/$", line)
if match and match.group(1) == skipping:
skipping = ''
continue
match = re.search (r"^#define (.*)$", line)
if match and match.group(1) in check_defines:
check_defines.remove (match.group(1))
print (line, end="")
continue
match = re.search (r"^#ifdef (.*)$", line)
if match and match.group(1) in check_defines:
skipping = match.group(1)
continue
match = re.search (r"^#include \"(.*)\"$", line) match = re.search (r"^#include \"(.*)\"$", line)
if (match): if match:
load (os.path.join (os.path.dirname(path), match.group(1))) load (os.path.join (os.path.dirname(path), match.group(1)))
else: else:
print (line, end="") print (line, end="")

View File

@ -179,7 +179,10 @@ gtk_gst_color_state_from_colorimetry (GtkGstSink *self,
gdk_cicp_params_set_transfer_function (params, gst_video_transfer_function_to_iso (colorimetry->transfer)); gdk_cicp_params_set_transfer_function (params, gst_video_transfer_function_to_iso (colorimetry->transfer));
#if 0 #if 0
gdk_cicp_params_set_matrix_coefficients (params, gst_video_color_matrix_to_iso (colorimetry->matrix)); gdk_cicp_params_set_matrix_coefficients (params, gst_video_color_matrix_to_iso (colorimetry->matrix));
gdk_cicp_params_set_full_range (params, colorimetry->range == GST_VIDEO_COLOR_RANGE_0_255); gdk_cicp_params_set_range (params, colorimetry->range == GST_VIDEO_COLOR_RANGE_0_255 ? GDK_CICP_RANGE_FULL : GDK_CICP_RANGE_NARROW);
#else
gdk_cicp_params_set_matrix_coefficients (params, 0);
gdk_cicp_params_set_range (params, GDK_CICP_RANGE_FULL);
#endif #endif
color_state = gdk_cicp_params_build_color_state (params, &error); color_state = gdk_cicp_params_build_color_state (params, &error);
g_object_unref (params); g_object_unref (params);