void DrawMedianRect(GfxTexture* texture, float x0, float y0, float x1, float y1, GfxTexture* render_target) { if(render_target) { glBindFramebuffer(GL_FRAMEBUFFER,render_target->GetFramebufferId()); glViewport ( 0, 0, render_target->GetWidth(), render_target->GetHeight() ); check(); } glUseProgram(GMedianProg.GetId()); check(); glUniform2f(glGetUniformLocation(GMedianProg.GetId(),"offset"),x0,y0); glUniform2f(glGetUniformLocation(GMedianProg.GetId(),"scale"),x1-x0,y1-y0); glUniform1i(glGetUniformLocation(GMedianProg.GetId(),"tex"), 0); glUniform2f(glGetUniformLocation(GMedianProg.GetId(),"texelsize"),1.f/texture->GetWidth(),1.f/texture->GetHeight()); check(); glBindBuffer(GL_ARRAY_BUFFER, GQuadVertexBuffer); check(); glBindTexture(GL_TEXTURE_2D,texture->GetId()); check(); GLuint loc = glGetAttribLocation(GSimpleProg.GetId(),"vertex"); glVertexAttribPointer(loc, 4, GL_FLOAT, 0, 16, 0); check(); glEnableVertexAttribArray(loc); check(); glDrawArrays ( GL_TRIANGLE_STRIP, 0, 4 ); check(); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); if(render_target) { //glFinish(); check(); //glFlush(); check(); glBindFramebuffer(GL_FRAMEBUFFER,0); glViewport ( 0, 0, GScreenWidth, GScreenHeight ); } }
void DrawYUVTextureRect(GfxTexture* ytexture, GfxTexture* utexture, GfxTexture* vtexture, float x0, float y0, float x1, float y1, GfxTexture* render_target, int whichTexture) { if(render_target) { glBindFramebuffer(GL_FRAMEBUFFER,render_target->GetFramebufferId()); glViewport ( 0, 0, render_target->GetWidth(), render_target->GetHeight() ); check(); } glUseProgram(GYUVProg.GetId()); check(); glUniform2f(glGetUniformLocation(GYUVProg.GetId(),"offset"),x0,y0); glUniform2f(glGetUniformLocation(GYUVProg.GetId(),"scale"),x1-x0,y1-y0); glUniform1i(glGetUniformLocation(GYUVProg.GetId(),"tex0"), 0); glUniform1i(glGetUniformLocation(GYUVProg.GetId(),"tex1"), 1); glUniform1i(glGetUniformLocation(GYUVProg.GetId(),"tex2"), 2); check(); if(whichTexture == 0) { glBindBuffer(GL_ARRAY_BUFFER, GQuadVertexBuffer); check(); } else { } glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,ytexture->GetId()); check(); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D,utexture->GetId()); check(); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D,vtexture->GetId()); check(); glActiveTexture(GL_TEXTURE0); GLuint loc = glGetAttribLocation(GYUVProg.GetId(),"vertex"); glVertexAttribPointer(loc, 4, GL_FLOAT, 0, 16, 0); check(); glEnableVertexAttribArray(loc); check(); glDrawArrays ( GL_TRIANGLE_STRIP, 0, 4 ); check(); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); if(render_target) { //glFinish(); check(); //glFlush(); check(); glBindFramebuffer(GL_FRAMEBUFFER,0); glViewport ( 0, 0, GScreenWidth, GScreenHeight ); } }
void DrawTextureRect(GfxTexture* texture, float x0, float y0, float x1, float y1, GfxTexture* render_target, int whichTexture, float x, float y) { //float x = 0.11; //float y = 0.11; if(render_target) { glBindFramebuffer(GL_FRAMEBUFFER,render_target->GetFramebufferId()); glViewport ( 0, 0, render_target->GetWidth(), render_target->GetHeight() ); check(); } glUseProgram(GSimpleProg.GetId()); check(); glUniform2f(glGetUniformLocation(GSimpleProg.GetId(),"offset"),x0,y0); glUniform2f(glGetUniformLocation(GSimpleProg.GetId(),"scale"),x1-x0,y1-y0); glUniform1i(glGetUniformLocation(GSimpleProg.GetId(),"tex"), 0); check(); if(whichTexture == 0) { glBindBuffer(GL_ARRAY_BUFFER, GQuadVertexBuffer); check(); } else { } glBindTexture(GL_TEXTURE_2D,texture->GetId()); check(); GLuint loc = glGetAttribLocation(GSimpleProg.GetId(),"vertex"); glVertexAttribPointer(loc, 4, GL_FLOAT, 0, 16, 0); check(); glEnableVertexAttribArray(loc); check(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDrawArrays ( GL_TRIANGLE_STRIP, 0, 4 ); check(); glDisable(GL_BLEND); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); if(render_target) { //glFinish(); check(); //glFlush(); check(); glBindFramebuffer(GL_FRAMEBUFFER,0); glViewport ( 0, 0, GScreenWidth, GScreenHeight ); } }
void DrawTextureRect(GfxTexture* texture, float x0, float y0, float x1, float y1) { glUseProgram(GSimpleProg.GetId()); check(); glUniform2f(glGetUniformLocation(GSimpleProg.GetId(),"offset"),x0,y0); glUniform2f(glGetUniformLocation(GSimpleProg.GetId(),"scale"),x1-x0,y1-y0); glUniform1i(glGetUniformLocation(GSimpleProg.GetId(),"tex"), 0); check(); glBindBuffer(GL_ARRAY_BUFFER, GQuadVertexBuffer); check(); glBindTexture(GL_TEXTURE_2D,texture->GetId()); check(); GLuint loc = glGetAttribLocation(GSimpleProg.GetId(),"vertex"); check(); glVertexAttribPointer(loc, 4, GL_FLOAT, 0, 16, 0); check(); glEnableVertexAttribArray(loc); check(); glDrawArrays ( GL_TRIANGLE_STRIP, 0, 4 ); check(); glFinish(); check(); glFlush(); check(); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); }
void InitGraphics() { bcm_host_init(); int32_t success = 0; EGLBoolean result; EGLint num_config; static EGL_DISPMANX_WINDOW_T nativewindow; DISPMANX_ELEMENT_HANDLE_T dispman_element; DISPMANX_DISPLAY_HANDLE_T dispman_display; DISPMANX_UPDATE_HANDLE_T dispman_update; VC_RECT_T dst_rect; VC_RECT_T src_rect; static const EGLint attribute_list[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; static const EGLint context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; EGLConfig config; // get an EGL display connection GDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); assert(GDisplay!=EGL_NO_DISPLAY); check(); // initialize the EGL display connection result = eglInitialize(GDisplay, NULL, NULL); assert(EGL_FALSE != result); check(); // get an appropriate EGL frame buffer configuration result = eglChooseConfig(GDisplay, attribute_list, &config, 1, &num_config); assert(EGL_FALSE != result); check(); // get an appropriate EGL frame buffer configuration result = eglBindAPI(EGL_OPENGL_ES_API); assert(EGL_FALSE != result); check(); // create an EGL rendering context GContext = eglCreateContext(GDisplay, config, EGL_NO_CONTEXT, context_attributes); assert(GContext!=EGL_NO_CONTEXT); check(); // create an EGL window surface success = graphics_get_display_size(0 /* LCD */, &GScreenWidth, &GScreenHeight); assert( success >= 0 ); dst_rect.x = 0; dst_rect.y = 0; dst_rect.width = GScreenWidth; dst_rect.height = GScreenHeight; src_rect.x = 0; src_rect.y = 0; src_rect.width = GScreenWidth << 16; src_rect.height = GScreenHeight << 16; dispman_display = vc_dispmanx_display_open( 0 /* LCD */); dispman_update = vc_dispmanx_update_start( 0 ); dispman_element = vc_dispmanx_element_add ( dispman_update, dispman_display, 0/*layer*/, &dst_rect, 0/*src*/, &src_rect, DISPMANX_PROTECTION_NONE, 0 /*alpha*/, 0/*clamp*/, (DISPMANX_TRANSFORM_T)0/*transform*/); nativewindow.element = dispman_element; nativewindow.width = GScreenWidth; nativewindow.height = GScreenHeight; vc_dispmanx_update_submit_sync( dispman_update ); check(); GSurface = eglCreateWindowSurface( GDisplay, config, &nativewindow, NULL ); assert(GSurface != EGL_NO_SURFACE); check(); // connect the context to the surface result = eglMakeCurrent(GDisplay, GSurface, GSurface, GContext); assert(EGL_FALSE != result); check(); // Set background color and clear buffers glClearColor(0.15f, 0.25f, 0.35f, 1.0f); glClear( GL_COLOR_BUFFER_BIT ); //load the test shaders GSimpleVS.LoadVertexShader("simplevertshader.glsl"); GSimpleFS.LoadFragmentShader("simplefragshader.glsl"); GSimpleProg.Create(&GSimpleVS,&GSimpleFS); check(); glUseProgram(GSimpleProg.GetId()); check(); //create an ickle vertex buffer static const GLfloat quad_vertex_positions[] = { 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; glGenBuffers(1, &GQuadVertexBuffer); check(); glBindBuffer(GL_ARRAY_BUFFER, GQuadVertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(quad_vertex_positions), quad_vertex_positions, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); check(); }