1 /************************************************************************** 2 * 3 * Copyright (C) 2014 Red Hat Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included 13 * in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 **************************************************************************/ 24 #ifndef VREND_BLITTER_H 25 #define VREND_BLITTER_H 26 27 #include "util/os_misc.h" 28 #include "util/macros.h" 29 30 /* shaders for blitting */ 31 32 #define FS_HEADER_GL \ 33 "#version 130\n" \ 34 "// Blitter\n" \ 35 "%s" \ 36 37 #define FS_HEADER_GLES \ 38 "#version 310 es\n" \ 39 "// Blitter\n" \ 40 "%s" \ 41 "precision mediump float;\n" \ 42 43 #define FS_HEADER_GLES_MS_ARRAY \ 44 "#version 310 es\n" \ 45 "// Blitter\n" \ 46 "#extension GL_OES_texture_storage_multisample_2d_array: require\n" \ 47 "%s" \ 48 "precision mediump float;\n" \ 49 50 #define HEADER_GL \ 51 "#version 130\n" \ 52 "// Blitter\n" \ 53 54 #define HEADER_GLES \ 55 "#version 310 es\n" \ 56 "// Blitter\n" \ 57 "precision mediump float;\n" \ 58 59 #define HEADER_GLES_MS_ARRAY \ 60 "#version 310 es\n" \ 61 "// Blitter\n" \ 62 "#extension GL_OES_texture_storage_multisample_2d_array: require\n" \ 63 "precision mediump float;\n" \ 64 65 66 #define FS_FUNC_COL_SRGB_DECODE \ 67 "cvec4 srgb_decode(cvec4 col) {\n" \ 68 " vec3 temp = vec3(col.rgb);\n" \ 69 " bvec3 thresh = lessThanEqual(temp, vec3(0.04045));\n" \ 70 " vec3 a = temp / vec3(12.92);\n" \ 71 " vec3 b = pow((temp + vec3(0.055)) / vec3(1.055), vec3(2.4));\n" \ 72 " return cvec4(clamp(mix(b, a, thresh), 0.0, 1.0), col.a);\n" \ 73 "}\n" 74 75 #define FS_FUNC_COL_SRGB_ENCODE \ 76 "cvec4 srgb_encode(cvec4 col) {\n" \ 77 " vec3 temp = vec3(col.rgb);\n" \ 78 " bvec3 thresh = lessThanEqual(temp, vec3(0.0031308));\n" \ 79 " vec3 a = temp * vec3(12.92);\n" \ 80 " vec3 b = (vec3(1.055) * pow(temp, vec3(1.0 / 2.4))) - vec3(0.055);\n" \ 81 " return cvec4(mix(b, a, thresh), col.a);\n" \ 82 "}\n" 83 84 85 #define VS_PASSTHROUGH_BODY \ 86 "in vec4 arg0;\n" \ 87 "in vec4 arg1;\n" \ 88 "out vec4 tc;\n" \ 89 "void main() {\n" \ 90 " gl_Position = arg0;\n" \ 91 " tc = arg1;\n" \ 92 "}\n" 93 94 #define VS_PASSTHROUGH_GL HEADER_GL VS_PASSTHROUGH_BODY 95 #define VS_PASSTHROUGH_GLES HEADER_GLES VS_PASSTHROUGH_BODY 96 97 #define FS_TEXFETCH_COL_BODY \ 98 "#define cvec4 %s\n" \ 99 "%s\n" /* conditional decode() */ \ 100 "%s\n" /* conditional encode() */ \ 101 "#define decode %s\n" \ 102 "#define encode %s\n" \ 103 "uniform mediump %csampler%s samp;\n" \ 104 "in vec4 tc;\n" \ 105 "out cvec4 FragColor;\n" \ 106 "void main() {\n" \ 107 " cvec4 texel = decode(cvec4(texture(samp, tc%s)));\n" \ 108 " FragColor = encode(cvec4(%s));\n" \ 109 "}\n" 110 111 #define FS_TEXFETCH_COL_GLES_1D_BODY \ 112 "#define cvec4 %s\n" \ 113 "%s\n" /* conditional decode() */ \ 114 "%s\n" /* conditional encode() */ \ 115 "#define decode %s\n" \ 116 "#define encode %s\n" \ 117 "uniform mediump %csampler%s samp;\n" \ 118 "in vec4 tc;\n" \ 119 "out cvec4 FragColor;\n" \ 120 "void main() {\n" \ 121 " cvec4 texel = decode(texture(samp, vec2(tc%s, 0.5)));\n" \ 122 " FragColor = encode(cvec4(%s));\n" \ 123 "}\n" 124 125 #define FS_TEXFETCH_COL_GL FS_HEADER_GL FS_TEXFETCH_COL_BODY 126 #define FS_TEXFETCH_COL_GLES FS_HEADER_GLES FS_TEXFETCH_COL_BODY 127 #define FS_TEXFETCH_COL_GLES_1D FS_HEADER_GLES FS_TEXFETCH_COL_GLES_1D_BODY 128 129 #define FS_TEXFETCH_COL_MSAA_BODY \ 130 "#define cvec4 %s\n" \ 131 "%s\n" /* conditional decode() */ \ 132 "%s\n" /* conditional encode() */ \ 133 "#define decode %s\n" \ 134 "#define encode %s\n" \ 135 "uniform mediump %csampler%s samp;\n" \ 136 "in vec4 tc;\n" \ 137 "out cvec4 FragColor;\n" \ 138 "void main() {\n" \ 139 " const int num_samples = %d;\n" \ 140 " cvec4 texel = cvec4(0);\n" \ 141 " for (int i = 0; i < num_samples; ++i) \n" \ 142 " texel += decode(texelFetch(samp, %s(tc%s), i));\n" \ 143 " texel = texel / cvec4(num_samples);\n" \ 144 " FragColor = encode(cvec4(%s));\n" \ 145 "}\n" 146 147 #define FS_TEXFETCH_COL_MSAA_GL FS_HEADER_GL FS_TEXFETCH_COL_MSAA_BODY 148 #define FS_TEXFETCH_COL_MSAA_GLES FS_HEADER_GLES FS_TEXFETCH_COL_MSAA_BODY 149 #define FS_TEXFETCH_COL_MSAA_ARRAY_GLES FS_HEADER_GLES_MS_ARRAY FS_TEXFETCH_COL_MSAA_BODY 150 151 #define FS_TEXFETCH_DS_BODY \ 152 "uniform mediump sampler%s samp;\n" \ 153 "in vec4 tc;\n" \ 154 "void main() {\n" \ 155 " gl_FragDepth = float(texture(samp, tc%s).x);\n" \ 156 "}\n" 157 158 #define FS_TEXFETCH_DS_GL HEADER_GL FS_TEXFETCH_DS_BODY 159 #define FS_TEXFETCH_DS_GLES HEADER_GLES FS_TEXFETCH_DS_BODY 160 161 #define FS_TEXFETCH_DS_MSAA_BODY \ 162 "#extension GL_ARB_texture_multisample : enable\n" \ 163 "uniform sampler%s samp;\n" \ 164 "in vec4 tc;\n" \ 165 "void main() {\n" \ 166 " gl_FragDepth = float(texelFetch(samp, %s(tc%s), 0).x);\n" \ 167 "}\n" 168 169 #define FS_TEXFETCH_DS_MSAA_BODY_GLES \ 170 "uniform mediump sampler%s samp;\n" \ 171 "in vec4 tc;\n" \ 172 "void main() {\n" \ 173 " gl_FragDepth = float(texelFetch(samp, %s(tc%s), 0).x);\n" \ 174 "}\n" 175 176 177 struct vrend_context; 178 struct vrend_resource; 179 struct vrend_blit_info; 180 #define FS_TEXFETCH_DS_MSAA_GL HEADER_GL FS_TEXFETCH_DS_MSAA_BODY 181 #define FS_TEXFETCH_DS_MSAA_GLES HEADER_GLES FS_TEXFETCH_DS_MSAA_BODY_GLES 182 #define FS_TEXFETCH_DS_MSAA_ARRAY_GLES HEADER_GLES_MS_ARRAY FS_TEXFETCH_DS_MSAA_BODY_GLES 183 184 /* implement blitting using OpenGL. */ 185 void vrend_renderer_blit_gl(ASSERTED struct vrend_context *ctx, 186 struct vrend_resource *src_res, 187 struct vrend_resource *dst_res, 188 const struct vrend_blit_info *info); 189 void vrend_blitter_fini(void); 190 191 #endif 192