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 /* shaders for blitting */ 28 29 #define HEADER_GL \ 30 "#version 130\n" \ 31 "// Blitter\n" \ 32 33 #define HEADER_GLES \ 34 "#version 310 es\n" \ 35 "// Blitter\n" \ 36 "precision mediump float;\n" \ 37 38 #define HEADER_GLES_MS_ARRAY \ 39 "#version 310 es\n" \ 40 "// Blitter\n" \ 41 "#extension GL_OES_texture_storage_multisample_2d_array: require\n" \ 42 "precision mediump float;\n" \ 43 44 45 #define VS_PASSTHROUGH_BODY \ 46 "in vec4 arg0;\n" \ 47 "in vec4 arg1;\n" \ 48 "out vec4 tc;\n" \ 49 "void main() {\n" \ 50 " gl_Position = arg0;\n" \ 51 " tc = arg1;\n" \ 52 "}\n" 53 54 #define VS_PASSTHROUGH_GL HEADER_GL VS_PASSTHROUGH_BODY 55 #define VS_PASSTHROUGH_GLES HEADER_GLES VS_PASSTHROUGH_BODY 56 57 58 #define FS_TEXFETCH_COL_BODY \ 59 "%s" \ 60 "#define cvec4 %s\n" \ 61 "uniform mediump %csampler%s samp;\n" \ 62 "in vec4 tc;\n" \ 63 "out cvec4 FragColor;\n" \ 64 "void main() {\n" \ 65 " cvec4 texel = texture(samp, tc%s);\n" \ 66 " FragColor = cvec4(%s);\n" \ 67 "}\n" 68 69 #define FS_TEXFETCH_COL_GLES_1D_BODY \ 70 "%s" \ 71 "#define cvec4 %s\n" \ 72 "uniform mediump %csampler%s samp;\n" \ 73 "in vec4 tc;\n" \ 74 "out cvec4 FragColor;\n" \ 75 "void main() {\n" \ 76 " cvec4 texel = texture(samp, vec2(tc%s, 0.5));\n" \ 77 " FragColor = cvec4(%s);\n" \ 78 "}\n" 79 80 #define FS_TEXFETCH_COL_GL HEADER_GL FS_TEXFETCH_COL_BODY 81 #define FS_TEXFETCH_COL_GLES HEADER_GLES FS_TEXFETCH_COL_BODY 82 #define FS_TEXFETCH_COL_GLES_1D HEADER_GLES FS_TEXFETCH_COL_GLES_1D_BODY 83 84 #define FS_TEXFETCH_COL_MSAA_BODY \ 85 "%s" \ 86 "#define cvec4 %s\n" \ 87 "uniform mediump %csampler%s samp;\n" \ 88 "in vec4 tc;\n" \ 89 "out cvec4 FragColor;\n" \ 90 "void main() {\n" \ 91 " const int num_samples = %d;\n" \ 92 " cvec4 texel = cvec4(0);\n" \ 93 " for (int i = 0; i < num_samples; ++i) \n" \ 94 " texel += texelFetch(samp, %s(tc%s), i);\n" \ 95 " texel = texel / cvec4(num_samples);\n" \ 96 " FragColor = cvec4(%s);\n" \ 97 "}\n" 98 99 #define FS_TEXFETCH_COL_MSAA_GL HEADER_GL FS_TEXFETCH_COL_MSAA_BODY 100 #define FS_TEXFETCH_COL_MSAA_GLES HEADER_GLES FS_TEXFETCH_COL_MSAA_BODY 101 #define FS_TEXFETCH_COL_MSAA_ARRAY_GLES HEADER_GLES_MS_ARRAY FS_TEXFETCH_COL_MSAA_BODY 102 103 #define FS_TEXFETCH_DS_BODY \ 104 "uniform mediump sampler%s samp;\n" \ 105 "in vec4 tc;\n" \ 106 "void main() {\n" \ 107 " gl_FragDepth = float(texture(samp, tc%s).x);\n" \ 108 "}\n" 109 110 #define FS_TEXFETCH_DS_GL HEADER_GL FS_TEXFETCH_DS_BODY 111 #define FS_TEXFETCH_DS_GLES HEADER_GLES FS_TEXFETCH_DS_BODY 112 113 #define FS_TEXFETCH_DS_MSAA_BODY \ 114 "#extension GL_ARB_texture_multisample : enable\n" \ 115 "uniform sampler%s samp;\n" \ 116 "in vec4 tc;\n" \ 117 "void main() {\n" \ 118 " gl_FragDepth = float(texelFetch(samp, %s(tc%s), int(tc.z)).x);\n" \ 119 "}\n" 120 121 #define FS_TEXFETCH_DS_MSAA_BODY_GLES \ 122 "uniform mediump sampler%s samp;\n" \ 123 "in vec4 tc;\n" \ 124 "void main() {\n" \ 125 " gl_FragDepth = float(texelFetch(samp, %s(tc%s), int(tc.z)).x);\n" \ 126 "}\n" 127 128 129 #define FS_TEXFETCH_DS_MSAA_GL HEADER_GL FS_TEXFETCH_DS_MSAA_BODY 130 #define FS_TEXFETCH_DS_MSAA_GLES HEADER_GLES FS_TEXFETCH_DS_MSAA_BODY_GLES 131 #define FS_TEXFETCH_DS_MSAA_ARRAY_GLES HEADER_GLES_MS_ARRAY FS_TEXFETCH_DS_MSAA_BODY_GLES 132 133 134 #endif 135