X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ui%2Fshader.c;h=1ffddbef3bb83a7941f125ae416cafb7c7a5d941;hb=375f74f473cfcb0c73a64088a6a5880829c155da;hp=52a46329307c1ba57e988c30f89b46f7726c2652;hpb=874e9aeeeb74c5459639a93439a502d262847e68;p=mirror_qemu.git diff --git a/ui/shader.c b/ui/shader.c index 52a4632930..1ffddbef3b 100644 --- a/ui/shader.c +++ b/ui/shader.c @@ -24,26 +24,48 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#include "qemu/osdep.h" #include "qemu-common.h" #include "ui/shader.h" /* ---------------------------------------------------------------------- */ -void qemu_gl_run_texture_blit(GLint texture_blit_prog) +GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog) { - GLfloat in_position[] = { + static const GLfloat in_position[] = { -1, -1, 1, -1, -1, 1, 1, 1, }; GLint l_position; + GLuint vao, buffer; + + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + /* this is the VBO that holds the vertex data */ + glGenBuffers(1, &buffer); + glBindBuffer(GL_ARRAY_BUFFER, buffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(in_position), in_position, + GL_STATIC_DRAW); - glUseProgram(texture_blit_prog); l_position = glGetAttribLocation(texture_blit_prog, "in_position"); - glVertexAttribPointer(l_position, 2, GL_FLOAT, GL_FALSE, 0, in_position); + glVertexAttribPointer(l_position, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(l_position); - glDrawArrays(GL_TRIANGLE_STRIP, l_position, 4); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + return vao; +} + +void qemu_gl_run_texture_blit(GLint texture_blit_prog, + GLint texture_blit_vao) +{ + glUseProgram(texture_blit_prog); + glBindVertexArray(texture_blit_vao); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } /* ---------------------------------------------------------------------- */ @@ -61,12 +83,12 @@ GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src) glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if (!status) { glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); - errmsg = malloc(length); + errmsg = g_malloc(length); glGetShaderInfoLog(shader, length, &length, errmsg); fprintf(stderr, "%s: compile %s error\n%s\n", __func__, (type == GL_VERTEX_SHADER) ? "vertex" : "fragment", errmsg); - free(errmsg); + g_free(errmsg); return 0; } return shader; @@ -86,10 +108,10 @@ GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag) glGetProgramiv(program, GL_LINK_STATUS, &status); if (!status) { glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length); - errmsg = malloc(length); + errmsg = g_malloc(length); glGetProgramInfoLog(program, length, &length, errmsg); fprintf(stderr, "%s: link program: %s\n", __func__, errmsg); - free(errmsg); + g_free(errmsg); return 0; } return program;