From e67666da69e6d68072173a256f3388383dced013 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 5 Jul 2017 01:12:59 +0200 Subject: [PATCH] Use the new Movit VAO functionality. See the Movit changelog for full rationale, but basically it works around a crash bug in NVIDIA's drivers. --- README | 6 +++--- chroma_subsampler.cpp | 47 +++++++++---------------------------------- chroma_subsampler.h | 4 ++-- 3 files changed, 14 insertions(+), 43 deletions(-) diff --git a/README b/README index c89a3e8..01adb4e 100644 --- a/README +++ b/README @@ -42,7 +42,7 @@ Nageru is in beta stage. It currently needs: but also for stability. You need at least version 0.7.0. - Movit, my GPU-based video filter library (https://movit.sesse.net). - You will need at least version 1.5.1. + You will need at least version 1.5.2. - Qt 5.5 or newer for the GUI. @@ -79,9 +79,9 @@ with: libasound2-dev libx264-dev libbmusb-dev protobuf-compiler \ libprotobuf-dev libpci-dev -Exceptions as of May 2017: +Exceptions as of July 2017: - - You will need Movit from experimental; stretch only has 1.4.0. + - You will need Movit from git; stretch only has 1.4.0. - You will need bmusb from experimental; stretch only has 0.5.4. diff --git a/chroma_subsampler.cpp b/chroma_subsampler.cpp index 0b21413..80e2467 100644 --- a/chroma_subsampler.cpp +++ b/chroma_subsampler.cpp @@ -273,10 +273,7 @@ ChromaSubsampler::~ChromaSubsampler() void ChromaSubsampler::subsample_chroma(GLuint cbcr_tex, unsigned width, unsigned height, GLuint dst_tex, GLuint dst2_tex) { - GLuint vao; - glGenVertexArrays(1, &vao); - check_error(); - + GLuint vao = resource_pool->create_vec2_vao({ cbcr_position_attribute_index, cbcr_texcoord_attribute_index }, vbo); glBindVertexArray(vao); check_error(); @@ -311,38 +308,24 @@ void ChromaSubsampler::subsample_chroma(GLuint cbcr_tex, unsigned width, unsigne check_error(); glUniform1i(cbcr_texture_sampler_uniform, 0); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - check_error(); - - for (GLint attr_index : { cbcr_position_attribute_index, cbcr_texcoord_attribute_index }) { - glEnableVertexAttribArray(attr_index); - check_error(); - glVertexAttribPointer(attr_index, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); - check_error(); - } - glDrawArrays(GL_TRIANGLES, 0, 3); check_error(); - for (GLint attr_index : { cbcr_position_attribute_index, cbcr_texcoord_attribute_index }) { - glDisableVertexAttribArray(attr_index); - check_error(); - } - glUseProgram(0); check_error(); glBindFramebuffer(GL_FRAMEBUFFER, 0); check_error(); + glBindVertexArray(0); + check_error(); resource_pool->release_fbo(fbo); - glDeleteVertexArrays(1, &vao); - check_error(); + resource_pool->release_vec2_vao(vao); } void ChromaSubsampler::create_uyvy(GLuint y_tex, GLuint cbcr_tex, unsigned width, unsigned height, GLuint dst_tex) { - GLuint vao; - glGenVertexArrays(1, &vao); + GLuint vao = resource_pool->create_vec2_vao({ cbcr_position_attribute_index, cbcr_texcoord_attribute_index }, vbo); + glBindVertexArray(vao); check_error(); glBindVertexArray(vao); @@ -395,32 +378,20 @@ void ChromaSubsampler::create_uyvy(GLuint y_tex, GLuint cbcr_tex, unsigned width glBindBuffer(GL_ARRAY_BUFFER, vbo); check_error(); - for (GLint attr_index : { uyvy_position_attribute_index, uyvy_texcoord_attribute_index }) { - if (attr_index == -1) continue; - glEnableVertexAttribArray(attr_index); - check_error(); - glVertexAttribPointer(attr_index, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); - check_error(); - } - glDrawArrays(GL_TRIANGLES, 0, 3); check_error(); - for (GLint attr_index : { uyvy_position_attribute_index, uyvy_texcoord_attribute_index }) { - if (attr_index == -1) continue; - glDisableVertexAttribArray(attr_index); - check_error(); - } - glActiveTexture(GL_TEXTURE0); check_error(); glUseProgram(0); check_error(); glBindFramebuffer(GL_FRAMEBUFFER, 0); check_error(); + glBindVertexArray(0); + check_error(); resource_pool->release_fbo(fbo); - glDeleteVertexArrays(1, &vao); + resource_pool->release_vec2_vao(vao); } void ChromaSubsampler::create_v210(GLuint y_tex, GLuint cbcr_tex, unsigned width, unsigned height, GLuint dst_tex) diff --git a/chroma_subsampler.h b/chroma_subsampler.h index 6466285..8e9ff4e 100644 --- a/chroma_subsampler.h +++ b/chroma_subsampler.h @@ -42,12 +42,12 @@ private: GLuint cbcr_program_num; // Owned by . GLuint cbcr_texture_sampler_uniform; - GLuint cbcr_position_attribute_index, cbcr_texcoord_attribute_index; + GLint cbcr_position_attribute_index, cbcr_texcoord_attribute_index; GLuint cbcr_chroma_offset_0_location, cbcr_chroma_offset_1_location; GLuint uyvy_program_num; // Owned by . GLuint uyvy_y_texture_sampler_uniform, uyvy_cbcr_texture_sampler_uniform; - GLuint uyvy_position_attribute_index, uyvy_texcoord_attribute_index; + GLint uyvy_position_attribute_index, uyvy_texcoord_attribute_index; GLuint uyvy_luma_offset_0_location, uyvy_luma_offset_1_location; GLuint uyvy_chroma_offset_0_location, uyvy_chroma_offset_1_location; -- 2.39.2