/** \fn surfaceToImage */ bool glRGB::surfaceToImage(VdpOutputSurface surf,ADMImage *image) { bool r=true; widget->makeCurrent(); glPushMatrix(); fboY->bind(); processError("Bind"); glProgramY->setUniformValue("myTextureY", 0); processError("setUniform myTexture0"); QMatrix4x4 quadmat(realMatrix); glProgramY->setUniformValue("metrix",quadmat); processError("setUniform Matrix"); myGlActiveTexture(GL_TEXTURE0); processError("Active Texture"); glBindTexture(GL_TEXTURE_RECTANGLE_NV, texName[0]); processError("Bind Texture"); // GLvdpauSurfaceNV s=VDPAURegisterOutputSurfaceNV((GLvoid *)surf,GL_TEXTURE_2D,1,texName); printf("Surface =%d, GlSurface=%x, texName : %d\n",(int)surf,(int)s,(int)texName[0]); if(false==processError("Register")) { r=false; goto skip; } VDPAUSurfaceAccessNV(s,GL_READ_ONLY); VDPAUMapSurfacesNV(1,&s); processError("Map"); myGlActiveTexture(GL_TEXTURE0); processError("Active Texture"); glBindTexture(GL_TEXTURE_RECTANGLE_NV, texName[0]); processError("Bind Texture"); render(image,PLANAR_Y,fboY); downloadTextures(image,fboY); VDPAUUnmapSurfacesNV(1,&s); processError("Unmap"); VDPAUUnregisterSurfaceNV(s); processError("Unregister"); skip: fboY->release(); firstRun=false; glPopMatrix(); widget->doneCurrent(); return r; }
/** \fn uploadTexture */ void openGlSample::tinyUploadTex(ADMImage *image, ADM_PLANE plane, GLuint tex,int texNum ) { myGlActiveTexture(tex); glBindTexture(GL_TEXTURE_RECTANGLE_NV, texNum); glProgramY->setUniformValue("myTexture", texNum); glProgramY->setUniformValue("myWidth", image->GetWidth(plane)); glProgramY->setUniformValue("myHeight", image->GetHeight(plane)); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); if(!firstRun) { glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_LUMINANCE, image->GetPitch(plane), image->GetHeight(plane), 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image->GetReadPtr(plane)); }else { glTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, image->GetPitch(plane), image->GetHeight(plane), GL_LUMINANCE, GL_UNSIGNED_BYTE, image->GetReadPtr(plane)); } }
/** \fn image2image */ bool glRGB::imageToImage(const char *buffer,ADMImage *image) { bool r=true; int width=image->GetWidth(PLANAR_Y); int height=image->GetHeight(PLANAR_Y); widget->makeCurrent(); glPushMatrix(); // size is the last one... fboY->bind(); processError("Bind"); glProgramY->setUniformValue("myTextureY", 0); processError("setUniform myTexture0"); QMatrix4x4 quadmat(realMatrix); glProgramY->setUniformValue("metrix",quadmat); processError("setUniform Matrix"); myGlActiveTexture(GL_TEXTURE0); processError("Active Texture"); glBindTexture(GL_TEXTURE_RECTANGLE_NV, texName[0]); processError("Bind Texture"); // upload image glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); if(!firstRun) { glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); }else { glTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); } //----------------- render(image,PLANAR_Y,fboY); downloadTextures(image,fboY); fboY->release(); firstRun=false; glPopMatrix(); widget->doneCurrent(); return r; }