shader.c (98c710f2d5cdf37f29a267352eb1f3c28cbf369d) shader.c (46e19e149f3b129a22c440caba853188df67deab)
1/*
2 * QEMU opengl shader helper functions
3 *
4 * Copyright (c) 2014 Red Hat
5 *
6 * Authors:
7 * Gerd Hoffmann <kraxel@redhat.com>
8 *

--- 14 unchanged lines hidden (view full) ---

23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * THE SOFTWARE.
26 */
27#include "qemu/osdep.h"
28#include "qemu-common.h"
29#include "ui/shader.h"
30
1/*
2 * QEMU opengl shader helper functions
3 *
4 * Copyright (c) 2014 Red Hat
5 *
6 * Authors:
7 * Gerd Hoffmann <kraxel@redhat.com>
8 *

--- 14 unchanged lines hidden (view full) ---

23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * THE SOFTWARE.
26 */
27#include "qemu/osdep.h"
28#include "qemu-common.h"
29#include "ui/shader.h"
30
31#include "shader/texture-blit-vert.h"
32#include "shader/texture-blit-frag.h"
33
34struct QemuGLShader {
35 GLint texture_blit_prog;
36 GLint texture_blit_vao;
37};
38
31/* ---------------------------------------------------------------------- */
32
39/* ---------------------------------------------------------------------- */
40
33GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
41static GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
34{
35 static const GLfloat in_position[] = {
36 -1, -1,
37 1, -1,
38 -1, 1,
39 1, 1,
40 };
41 GLint l_position;

--- 13 unchanged lines hidden (view full) ---

55 glEnableVertexAttribArray(l_position);
56
57 glBindBuffer(GL_ARRAY_BUFFER, 0);
58 glBindVertexArray(0);
59
60 return vao;
61}
62
42{
43 static const GLfloat in_position[] = {
44 -1, -1,
45 1, -1,
46 -1, 1,
47 1, 1,
48 };
49 GLint l_position;

--- 13 unchanged lines hidden (view full) ---

63 glEnableVertexAttribArray(l_position);
64
65 glBindBuffer(GL_ARRAY_BUFFER, 0);
66 glBindVertexArray(0);
67
68 return vao;
69}
70
63void qemu_gl_run_texture_blit(GLint texture_blit_prog,
64 GLint texture_blit_vao)
71void qemu_gl_run_texture_blit(QemuGLShader *gls)
65{
72{
66 glUseProgram(texture_blit_prog);
67 glBindVertexArray(texture_blit_vao);
73 glUseProgram(gls->texture_blit_prog);
74 glBindVertexArray(gls->texture_blit_vao);
68 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
69}
70
71/* ---------------------------------------------------------------------- */
72
75 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
76}
77
78/* ---------------------------------------------------------------------- */
79
73GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src)
80static GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src)
74{
75 GLuint shader;
76 GLint status, length;
77 char *errmsg;
78
79 shader = glCreateShader(type);
80 glShaderSource(shader, 1, &src, 0);
81 glCompileShader(shader);

--- 7 unchanged lines hidden (view full) ---

89 (type == GL_VERTEX_SHADER) ? "vertex" : "fragment",
90 errmsg);
91 g_free(errmsg);
92 return 0;
93 }
94 return shader;
95}
96
81{
82 GLuint shader;
83 GLint status, length;
84 char *errmsg;
85
86 shader = glCreateShader(type);
87 glShaderSource(shader, 1, &src, 0);
88 glCompileShader(shader);

--- 7 unchanged lines hidden (view full) ---

96 (type == GL_VERTEX_SHADER) ? "vertex" : "fragment",
97 errmsg);
98 g_free(errmsg);
99 return 0;
100 }
101 return shader;
102}
103
97GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag)
104static GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag)
98{
99 GLuint program;
100 GLint status, length;
101 char *errmsg;
102
103 program = glCreateProgram();
104 glAttachShader(program, vert);
105 glAttachShader(program, frag);

--- 6 unchanged lines hidden (view full) ---

112 glGetProgramInfoLog(program, length, &length, errmsg);
113 fprintf(stderr, "%s: link program: %s\n", __func__, errmsg);
114 g_free(errmsg);
115 return 0;
116 }
117 return program;
118}
119
105{
106 GLuint program;
107 GLint status, length;
108 char *errmsg;
109
110 program = glCreateProgram();
111 glAttachShader(program, vert);
112 glAttachShader(program, frag);

--- 6 unchanged lines hidden (view full) ---

119 glGetProgramInfoLog(program, length, &length, errmsg);
120 fprintf(stderr, "%s: link program: %s\n", __func__, errmsg);
121 g_free(errmsg);
122 return 0;
123 }
124 return program;
125}
126
120GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src,
121 const GLchar *frag_src)
127static GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src,
128 const GLchar *frag_src)
122{
123 GLuint vert_shader, frag_shader, program;
124
125 vert_shader = qemu_gl_create_compile_shader(GL_VERTEX_SHADER, vert_src);
126 frag_shader = qemu_gl_create_compile_shader(GL_FRAGMENT_SHADER, frag_src);
127 if (!vert_shader || !frag_shader) {
128 return 0;
129 }
130
131 program = qemu_gl_create_link_program(vert_shader, frag_shader);
132 glDeleteShader(vert_shader);
133 glDeleteShader(frag_shader);
134
135 return program;
136}
129{
130 GLuint vert_shader, frag_shader, program;
131
132 vert_shader = qemu_gl_create_compile_shader(GL_VERTEX_SHADER, vert_src);
133 frag_shader = qemu_gl_create_compile_shader(GL_FRAGMENT_SHADER, frag_src);
134 if (!vert_shader || !frag_shader) {
135 return 0;
136 }
137
138 program = qemu_gl_create_link_program(vert_shader, frag_shader);
139 glDeleteShader(vert_shader);
140 glDeleteShader(frag_shader);
141
142 return program;
143}
144
145/* ---------------------------------------------------------------------- */
146
147QemuGLShader *qemu_gl_init_shader(void)
148{
149 QemuGLShader *gls = g_new0(QemuGLShader, 1);
150
151 gls->texture_blit_prog = qemu_gl_create_compile_link_program
152 (texture_blit_vert_src, texture_blit_frag_src);
153 if (!gls->texture_blit_prog) {
154 exit(1);
155 }
156
157 gls->texture_blit_vao =
158 qemu_gl_init_texture_blit(gls->texture_blit_prog);
159
160 return gls;
161}
162
163void qemu_gl_fini_shader(QemuGLShader *gls)
164{
165 if (!gls) {
166 return;
167 }
168 g_free(gls);
169}