From 9b1d03fcfe7a63e1adae761bb8204892c2a60be9 Mon Sep 17 00:00:00 2001 From: Quantum Date: Mon, 9 Aug 2021 05:15:42 -0400 Subject: [PATCH] [client] egl: implement #include for shaders with awk --- client/cmake/MakeObject.cmake | 17 ++++----- client/renderers/EGL/CMakeLists.txt | 33 +++++++++++++++-- client/renderers/EGL/glsl.include.awk | 13 +++++++ client/renderers/EGL/shader/color_blind.h | 37 +++++++++++++++++++ client/renderers/EGL/shader/cursor_rgb.frag | 38 ++------------------ client/renderers/EGL/shader/desktop_rgb.frag | 38 ++------------------ 6 files changed, 95 insertions(+), 81 deletions(-) create mode 100644 client/renderers/EGL/glsl.include.awk create mode 100644 client/renderers/EGL/shader/color_blind.h diff --git a/client/cmake/MakeObject.cmake b/client/cmake/MakeObject.cmake index 06d46164..e72bf3a5 100644 --- a/client/cmake/MakeObject.cmake +++ b/client/cmake/MakeObject.cmake @@ -5,23 +5,24 @@ function(make_object out_var) file(RELATIVE_PATH out_f ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/${in_f}") set(out_h "${CMAKE_CURRENT_BINARY_DIR}/${out_f}.h") set(out_f "${CMAKE_CURRENT_BINARY_DIR}/${out_f}.o") - string(REGEX REPLACE "[/.]" "_" sym_in ${in_f}) + string(REGEX REPLACE "[/.]" "_" sym_in "${CMAKE_CURRENT_SOURCE_DIR}/${in_f}") + string(REGEX REPLACE "[/.]" "_" sym_out "${in_f}") add_custom_command(OUTPUT ${out_f} - COMMAND ${CMAKE_LINKER} -r -b binary -o ${out_f} ${in_f} + COMMAND ${CMAKE_LINKER} -r -b binary -o ${out_f} "${CMAKE_CURRENT_SOURCE_DIR}/${in_f}" COMMAND ${CMAKE_OBJCOPY} --rename-section .data=.rodata,CONTENTS,ALLOC,LOAD,READONLY,DATA ${out_f} ${out_f} - COMMAND ${CMAKE_OBJCOPY} --redefine-sym _binary_${sym_in}_start=b_${sym_in} ${out_f} ${out_f} - COMMAND ${CMAKE_OBJCOPY} --redefine-sym _binary_${sym_in}_end=b_${sym_in}_end ${out_f} ${out_f} + COMMAND ${CMAKE_OBJCOPY} --redefine-sym _binary_${sym_in}_start=b_${sym_out} ${out_f} ${out_f} + COMMAND ${CMAKE_OBJCOPY} --redefine-sym _binary_${sym_in}_end=b_${sym_out}_end ${out_f} ${out_f} COMMAND ${CMAKE_OBJCOPY} --strip-symbol _binary_${sym_in}_size ${out_f} ${out_f} - DEPENDS ${in_f} + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${in_f}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Creating object from ${in_f}" VERBATIM ) - file(WRITE ${out_h} "extern const char b_${sym_in}[];\n") - file(APPEND ${out_h} "extern const char b_${sym_in}_end[];\n") - file(APPEND ${out_h} "#define b_${sym_in}_size (b_${sym_in}_end - b_${sym_in})\n") + file(WRITE ${out_h} "extern const char b_${sym_out}[];\n") + file(APPEND ${out_h} "extern const char b_${sym_out}_end[];\n") + file(APPEND ${out_h} "#define b_${sym_out}_size (b_${sym_out}_end - b_${sym_out})\n") get_filename_component(h_dir ${out_h} DIRECTORY) list(APPEND result_h ${h_dir}) diff --git a/client/renderers/EGL/CMakeLists.txt b/client/renderers/EGL/CMakeLists.txt index 5d3a7ff2..d0aadf75 100644 --- a/client/renderers/EGL/CMakeLists.txt +++ b/client/renderers/EGL/CMakeLists.txt @@ -12,8 +12,35 @@ pkg_check_modules(RENDERER_EGL_OPT IMPORTED_TARGET ) include(MakeObject) -make_object( - EGL_SHADER +function(build_shaders header_dir) + file(GLOB headers "${header_dir}/*.h") + message("${headers}") + set(EGL_SHADER_PROCESSED) + foreach(shader ${ARGN}) + set(out_f "${CMAKE_CURRENT_BINARY_DIR}/${shader}") + add_custom_command(OUTPUT "${out_f}" + COMMAND awk -f "${CMAKE_CURRENT_SOURCE_DIR}/glsl.include.awk" + "${CMAKE_CURRENT_SOURCE_DIR}/${shader}" > "${out_f}" + MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/${shader}" + DEPENDS ${headers} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/shader" + COMMENT "Preprocessing shader ${shader}" + VERBATIM + ) + endforeach() + + set(CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}") + make_object( + EGL_SHADER + ${ARGN} + ) + + set(EGL_SHADER_OBJS "${EGL_SHADER_OBJS}" PARENT_SCOPE) + set(EGL_SHADER_INCS "${EGL_SHADER_INCS}" PARENT_SCOPE) +endfunction() + +build_shaders( + shader shader/desktop.vert shader/desktop_rgb.frag shader/cursor.vert @@ -49,7 +76,7 @@ add_library(renderer_EGL STATIC splash.c damage.c ${EGL_SHADER_OBJS} - "${EGL_SHADER_INCS}/desktop_rgb.def.h" + "${CMAKE_CURRENT_BINARY_DIR}/shader/desktop_rgb.def.h" ${PROJECT_TOP}/repos/cimgui/imgui/backends/imgui_impl_opengl3.cpp ) diff --git a/client/renderers/EGL/glsl.include.awk b/client/renderers/EGL/glsl.include.awk new file mode 100644 index 00000000..1c96f782 --- /dev/null +++ b/client/renderers/EGL/glsl.include.awk @@ -0,0 +1,13 @@ +BEGIN { FS="\"" } + +function process(line, second) { + if (line ~ /^#include[ \t]*".+"[ \t]*$/) { + while (getline < second) { + process($0, $2) + } + } else { + print line + } +} + +{ process($0, $2) } diff --git a/client/renderers/EGL/shader/color_blind.h b/client/renderers/EGL/shader/color_blind.h new file mode 100644 index 00000000..ca286122 --- /dev/null +++ b/client/renderers/EGL/shader/color_blind.h @@ -0,0 +1,37 @@ +highp vec4 cbTransform(highp vec4 color, int cbMode) +{ + highp float L = (17.8824000 * color.r) + (43.516100 * color.g) + (4.11935 * color.b); + highp float M = (03.4556500 * color.r) + (27.155400 * color.g) + (3.86714 * color.b); + highp float S = (00.0299566 * color.r) + (00.184309 * color.g) + (1.46709 * color.b); + highp float l, m, s; + + if (cbMode == 1) // Protanope + { + l = 0.0f * L + 2.02344f * M + -2.52581f * S; + m = 0.0f * L + 1.0f * M + 0.0f * S; + s = 0.0f * L + 0.0f * M + 1.0f * S; + } + else if (cbMode == 2) // Deuteranope + { + l = 1.000000 * L + 0.0f * M + 0.00000 * S; + m = 0.494207 * L + 0.0f * M + 1.24827 * S; + s = 0.000000 * L + 0.0f * M + 1.00000 * S; + } + else if (cbMode == 3) // Tritanope + { + l = 1.000000 * L + 0.000000 * M + 0.0 * S; + m = 0.000000 * L + 1.000000 * M + 0.0 * S; + s = -0.395913 * L + 0.801109 * M + 0.0 * S; + } + + highp vec4 error; + error.r = ( 0.080944447900 * l) + (-0.13050440900 * m) + ( 0.116721066 * s); + error.g = (-0.010248533500 * l) + ( 0.05401932660 * m) + (-0.113614708 * s); + error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + ( 0.693511405 * s); + error.a = 0.0; + + error = color - error; + color.g += (error.r * 0.7) + (error.g * 1.0); + color.b += (error.r * 0.7) + (error.b * 1.0); + return color; +} diff --git a/client/renderers/EGL/shader/cursor_rgb.frag b/client/renderers/EGL/shader/cursor_rgb.frag index 8b0ed763..2ea39fc2 100644 --- a/client/renderers/EGL/shader/cursor_rgb.frag +++ b/client/renderers/EGL/shader/cursor_rgb.frag @@ -1,5 +1,7 @@ #version 300 es +#include "color_blind.h" + in highp vec2 uv; out highp vec4 color; @@ -13,39 +15,5 @@ void main() color = texture(sampler1, uv); if (cbMode > 0) - { - highp float L = (17.8824000 * color.r) + (43.516100 * color.g) + (4.11935 * color.b); - highp float M = (03.4556500 * color.r) + (27.155400 * color.g) + (3.86714 * color.b); - highp float S = (00.0299566 * color.r) + (00.184309 * color.g) + (1.46709 * color.b); - highp float l, m, s; - - if (cbMode == 1) // Protanope - { - l = 0.0f * L + 2.02344f * M + -2.52581f * S; - m = 0.0f * L + 1.0f * M + 0.0f * S; - s = 0.0f * L + 0.0f * M + 1.0f * S; - } - else if (cbMode == 2) // Deuteranope - { - l = 1.000000 * L + 0.0f * M + 0.00000 * S; - m = 0.494207 * L + 0.0f * M + 1.24827 * S; - s = 0.000000 * L + 0.0f * M + 1.00000 * S; - } - else if (cbMode == 3) // Tritanope - { - l = 1.000000 * L + 0.000000 * M + 0.0 * S; - m = 0.000000 * L + 1.000000 * M + 0.0 * S; - s = -0.395913 * L + 0.801109 * M + 0.0 * S; - } - - highp vec4 error; - error.r = ( 0.080944447900 * l) + (-0.13050440900 * m) + ( 0.116721066 * s); - error.g = (-0.010248533500 * l) + ( 0.05401932660 * m) + (-0.113614708 * s); - error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + ( 0.693511405 * s); - error.a = 0.0; - - error = color - error; - color.g += (error.r * 0.7) + (error.g * 1.0); - color.b += (error.r * 0.7) + (error.b * 1.0); - } + color = cbTransform(color, cbMode); } diff --git a/client/renderers/EGL/shader/desktop_rgb.frag b/client/renderers/EGL/shader/desktop_rgb.frag index 6de56b29..91629db3 100644 --- a/client/renderers/EGL/shader/desktop_rgb.frag +++ b/client/renderers/EGL/shader/desktop_rgb.frag @@ -5,6 +5,8 @@ #define EGL_SCALE_LINEAR 2 #define EGL_SCALE_MAX 3 +#include "color_blind.h" + in highp vec2 uv; out highp vec4 color; @@ -31,41 +33,7 @@ void main() } if (cbMode > 0) - { - highp float L = (17.8824000 * color.r) + (43.516100 * color.g) + (4.11935 * color.b); - highp float M = (03.4556500 * color.r) + (27.155400 * color.g) + (3.86714 * color.b); - highp float S = (00.0299566 * color.r) + (00.184309 * color.g) + (1.46709 * color.b); - highp float l, m, s; - - if (cbMode == 1) // Protanope - { - l = 0.0f * L + 2.02344f * M + -2.52581f * S; - m = 0.0f * L + 1.0f * M + 0.0f * S; - s = 0.0f * L + 0.0f * M + 1.0f * S; - } - else if (cbMode == 2) // Deuteranope - { - l = 1.000000 * L + 0.0f * M + 0.00000 * S; - m = 0.494207 * L + 0.0f * M + 1.24827 * S; - s = 0.000000 * L + 0.0f * M + 1.00000 * S; - } - else if (cbMode == 3) // Tritanope - { - l = 1.000000 * L + 0.000000 * M + 0.0 * S; - m = 0.000000 * L + 1.000000 * M + 0.0 * S; - s = -0.395913 * L + 0.801109 * M + 0.0 * S; - } - - highp vec4 error; - error.r = ( 0.080944447900 * l) + (-0.13050440900 * m) + ( 0.116721066 * s); - error.g = (-0.010248533500 * l) + ( 0.05401932660 * m) + (-0.113614708 * s); - error.b = (-0.000365296938 * l) + (-0.00412161469 * m) + ( 0.693511405 * s); - error.a = 0.0; - - error = color - error; - color.g += (error.r * 0.7) + (error.g * 1.0); - color.b += (error.r * 0.7) + (error.b * 1.0); - } + color = cbTransform(color, cbMode); if (nvGain > 0.0) {