#include "glmocoshader.h"\r
#include "videovpeogl.h"\r
\r
+#define BLOCK_TEXTURE_WIDTH 2048\r
+#define BLOCK_TEXTURE_HEIGHT 1024\r
+#define BLOCK_SIZE 64\r
+#define BLOCK_PER_ROW 32\r
+\r
const GLchar moco_vertex_shader[] =\r
- "attribute vec4 vec_pos;\n"\r
- "attribute vec2 tex_coord;\n"\r
- "varying vec2 out_texCoord;\n"\r
+ "attribute vec4 block_pos;\n"\r
+ "attribute vec2 block_edge;\n"\r
+ "attribute vec4 block_types;\n"\r
+ "attribute vec2 index;\n"\r
+ "attribute float cbp;\n"\r
+ "uniform vec2 pict_scale;\n"\r
+ // "attribute vec2 tex_coord;\n"\r
+ "varying vec4 out_yblockpos_x;\n"\r
+ "varying vec4 out_yblockpos_y;\n"\r
+ "varying vec4 out_uvblockpos_xy;\n"\r
+ "varying vec2 out_block_edge;\n"\r
+\r
+ "const float one=1.0;\n"\r
+ "const float c1024=1024.0;\n"\r
+ "const float c32=32.0;\n"\r
+\r
+\r
+ "const float c65536=65536.;\n"\r
+\r
+\r
+\r
+ "const vec4 y_cbp=vec4(1.0,2.0,4.0,8.0);\n"\r
+ "const vec2 uv_cbp=vec2(16.0,32.0);\n"\r
"void main()\n"\r
"{\n"\r
- " gl_Position=vec_pos;\n"\r
- " out_texCoord=tex_coord;\n"\r
+ // calculate cbp\r
+ " vec4 cbp_vec=vec4(cbp,cbp,cbp,cbp);\n"\r
+ " vec4 fmod_cbp_y=mod(cbp_vec,y_cbp);\n"\r
+ " vec2 fmod_cbp_uv=mod(cbp_vec.xy,uv_cbp);\n"\r
+ " fmod_cbp_y=sign(vec4(fmod_cbp_y.yzw,fmod_cbp_uv.x)-fmod_cbp_y);\n"\r
+ " fmod_cbp_uv=sign(vec2(fmod_cbp_uv.y,cbp)-fmod_cbp_uv);\n"\r
+ // resulting vector should indicate with block is present\r
+ // now transform it to a sum (TODO vectorize this)\r
+ " vec4 fmod_cbp_y2=fmod_cbp_y;\n"\r
+ " vec2 fmod_cbp_uv2=fmod_cbp_uv;\n"\r
+ " fmod_cbp_y2.y+=fmod_cbp_y2.x;\n"\r
+ " fmod_cbp_y2.z+=fmod_cbp_y2.y;\n"\r
+ " fmod_cbp_y2.w+=fmod_cbp_y2.z;\n"\r
+ " fmod_cbp_uv2.x+=fmod_cbp_y2.w;\n"\r
+ " fmod_cbp_uv2.y+=fmod_cbp_uv2.x;\n"\r
+\r
+ // now calculate their position inside the short array\r
+ " float m_index=index.x+index.y*c65536;\n" //Not Endian save\r
+ " fmod_cbp_y2+=m_index;\n" //shift to the blocks\r
+ " fmod_cbp_uv2+=m_index;\n"\r
+ " out_yblockpos_x=mod(fmod_cbp_y2,c32);\n"\r
+ " out_uvblockpos_xy.xy=mod(fmod_cbp_uv2,c32);\n"\r
+ " out_yblockpos_y=floor((fmod_cbp_y2)/c32);\n"\r
+ " out_uvblockpos_xy.zw=floor((fmod_cbp_uv2)/c32);\n"\r
+\r
+ //Kick out uncoded blocks\r
+ " out_yblockpos_y-=sign(fmod_cbp_y-one)*c1024;\n"\r
+ " out_uvblockpos_xy.zw-=sign(fmod_cbp_uv-one)*c1024;\n"\r
+\r
+\r
+ " out_block_edge=block_edge;\n"\r
+ " vec4 out_pos=block_pos;\n"\r
+ " out_pos.xy+=block_edge;\n"\r
+ " out_pos.xy*=pict_scale;\n"\r
+ " out_pos.xy-=vec2(one,one);"\r
+ " out_pos.zw=vec2(one,one);"\r
+ " gl_Position=out_pos;\n"\r
"}\n";\r
\r
const GLchar moco_frag_shader[] =\r
"precision mediump float;\n"\r
- "uniform sampler2D textureU;\n"\r
- "uniform sampler2D textureV;\n"\r
- "uniform sampler2D textureY;\n"\r
- "const float uv_corr=0.5;\n"\r
- "const float y_corr=0.0625;\n"\r
- "const mat3 yuvtransform= mat3( 1.164 ,0.0 ,1.596 ,\n"\r
- " 1.164 ,-0.391,-0.813 ,\n"\r
- " 1.164,2.018 , 0.0 );\n"\r
-// "const mat3 yuvtransform= mat3( 1. ,1. ,1. ,\n"\r
-// " 0.0 ,-0.3960,2.029 ,\n"\r
-// " 1.140,-0.581 , 0.0 );\n"\r
-// "const mat3 yuvtransform= mat3( 1. ,0 ,0. ,\n"\r
-// " 0.0 ,1.,0. ,\n"\r
-// " 0.,0. , 1.0 );\n"\r
-// "const mat3 yuvtransform= mat3( 1. ,1. ,1. ,\n"\r
-// " 0.0 ,-0.03960,0.2029 ,\n"\r
-// " 0.1140,-0.0581 , 0.0 );\n"\r
- "varying vec2 out_texCoord;\n"\r
+ "uniform sampler2D blocks;\n"\r
+ "varying vec4 out_yblockpos_x;\n"\r
+ "varying vec4 out_yblockpos_y;\n"\r
+ "varying vec4 out_uvblockpos_xy;\n"\r
+ "varying vec2 out_block_edge;\n"\r
+ "const float halfst=0.5;\n"\r
+ "const float ctwo=2.0;\n"\r
+ "const float sieben=7.0;\n"\r
+ "const float acht=8.0;\n"\r
+ "const float s8=1./8.;\n"\r
+ "const float s16=1./16.;\n"\r
+ "const float c1over2047=1./2047.;\n"\r
+ "const float c1over1023=1./1023.;\n"\r
+ "const float c255=255.;\n"\r
+ "const float c65280=65280.;\n"\r
+ "const float c65536=65536.;\n"\r
+ "const float cstep=32767.;\n"\r
+ "\n"\r
+ "float unpack_short(vec2 income) {\n"\r
+ " float temp=income.y*c65280+income.x*c255;\n"\r
+ " temp-=step(cstep,temp)*c65536;\n"\r
+ " return abs(temp/c255);\n" //temporary work around\r
+ "}"\r
+ // "uniform sampler2D textureV;\n"\r
+ // "uniform sampler2D textureY;\n"\r
+// "varying vec2 out_texCoord;\n"\r
"void main()\n"\r
"{\n"\r
- " vec3 help;\n"\r
- "help.x=texture2D(textureY,out_texCoord).r-y_corr;\n"\r
- "help.y=texture2D(textureU,out_texCoord).r-uv_corr;\n"\r
- "help.z=texture2D(textureV,out_texCoord).r-uv_corr;\n" //-uv_corr;\n"\r
- " gl_FragColor.rgb=help*yuvtransform;\n"\r
- " gl_FragColor.a=1.;\n"\r
+ // first figure out the block num for y, first decide between up and down, fix me field\r
+ //non field code\r
+ // " vec4 ypos_temp1=mix(vec4(out_yblockpos_x.x,out_yblockpos_y.x,out_yblockpos_x.y,out_yblockpos_y.y),"\r
+ // " vec4(out_yblockpos_x.z,out_yblockpos_y.z,out_yblockpos_x.w,out_yblockpos_y.w),step(halfst,out_block_edge.y));\n"\r
+ //field code\r
+ " vec4 ypos_temp1=mix(vec4(out_yblockpos_x.x,out_yblockpos_y.x,out_yblockpos_x.y,out_yblockpos_y.y),"\r
+ " vec4(out_yblockpos_x.z,out_yblockpos_y.z,out_yblockpos_x.w,out_yblockpos_y.w),step(s16,mod(out_block_edge.y,s8)));\n"\r
+\r
+ //decide between left and right\r
+ " vec2 ypos_temp2=mix(ypos_temp1.xy,ypos_temp1.zw,step(halfst,out_block_edge.x));\n"\r
+ //now get the intra 8x8 Block coordinates\r
+ " vec2 ypos_temp3=mod(out_block_edge,halfst)*ctwo;\n"\r
+ " ypos_temp2.x=(ypos_temp3.x*sieben+(ypos_temp3.y*sieben+acht*ypos_temp2.x)*acht)*c1over2047;\n"\r
+ " ypos_temp2.y*=c1over1023;\n"\r
+ " ypos_temp1=texture2D(blocks,ypos_temp2);\n" // now select the right data\r
+ " ypos_temp2=mix(ypos_temp1.rg,ypos_temp1.ba,step(c1over2047,mod(ypos_temp2.x,c1over1023)));\n" //activate this\r
+\r
+ " gl_FragColor.r=unpack_short(ypos_temp2.rg);\n" //signed later TODO\r
+ //" gl_FragColor.r=ypos_temp1.b;\n" //signed later TODO\r
+ " gl_FragColor.g=0.5;\n"\r
+ " gl_FragColor.b=0.5;\n"\r
+ " gl_FragColor.a=1.0;\n"\r
+ //" vec4 blocks=texture2D(blocks,gl_FragCoord.xy/600.);\n"\r
+// "help.x=texture2D(textureY,out_texCoord).r;\n"\r
+// "help.y=texture2D(textureU,out_texCoord).r;\n"\r
+// "help.z=texture2D(textureV,out_texCoord).r;\n" //-uv_corr;\n"\r
+ // " gl_FragColor.rgba=blocks;\n"\r
+ // " gl_FragColor.rgba=vec4(0.7,0.5,0.5,1.0);\n"\r
+ //" gl_FragColor.a=1.;\n"\r
"}\n";\r
\r
-GLMocoShader::GLMocoShader(): GLShader("GLYuv400Shader")\r
+GLMocoShader::GLMocoShader(): GLShader("GLMocoShader")\r
{\r
\r
frame_buf=0;\r
+ blocks_loc=0;\r
}\r
\r
GLMocoShader::~GLMocoShader()\r
}\r
\r
int GLMocoShader::init() {\r
+\r
if (!initShaders(moco_vertex_shader, moco_frag_shader)) {\r
+ Log::getInstance()->log("GLMocoShader", Log::ERR, "init Shaders failed for GLMocoShader");\r
return 0;\r
}\r
+ loc_pict_scale = glGetUniformLocation(shad_program, "pict_scale");\r
+ blocks_loc = glGetUniformLocation(shad_program, "blocks");\r
+\r
// frame_sampler_locY = glGetUniformLocation(shad_program, "textureY");\r
// Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",frame_sampler_locY,glGetError());\r
// frame_sampler_locU = glGetUniformLocation(shad_program, "textureU");\r
//Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",frame_sampler_locU,glGetError());\r
// frame_sampler_locV = glGetUniformLocation(shad_program, "textureV");\r
glGenFramebuffers(1, &frame_buf);\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "genframe bufmark1 glerror %x",glGetError());\r
glGenTextures(1, &data_blocks);\r
glBindTexture(GL_TEXTURE_2D, data_blocks);\r
- glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1024, 1024, 0, GL_LUMINANCE_ALPHA,\r
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, BLOCK_TEXTURE_WIDTH >>1, BLOCK_TEXTURE_HEIGHT, 0, GL_RGBA,\r
GL_UNSIGNED_BYTE, NULL);\r
+ char buffer[BLOCK_TEXTURE_WIDTH*4];\r
+ memset(buffer,0,BLOCK_TEXTURE_WIDTH*4); // the last line is black, simplifies the shader algorithms\r
+\r
+ glTexSubImage2D(GL_TEXTURE_2D,0,0,BLOCK_TEXTURE_HEIGHT-1,\r
+ 1024,1,\r
+ GL_RGBA,GL_UNSIGNED_BYTE,\r
+ buffer);\r
\r
glGenBuffers(1,¯o_block);\r
glBindBuffer(GL_ARRAY_BUFFER,macro_block);\r
}\r
GLushort *tri_indices_run=tri_indices;\r
for (int i=0;i<4096;i++) {\r
- *tri_indices_run=i+2*4096; //strip\r
- tri_indices_run++;\r
*tri_indices_run=i+0*4096; //strip\r
tri_indices_run++;\r
- *tri_indices_run=i+3*4096; //strip\r
+ *tri_indices_run=i+2*4096; //strip\r
tri_indices_run++;\r
*tri_indices_run=i+1*4096; //strip\r
tri_indices_run++;\r
- *tri_indices_run=i+1*4096; //strip\r
+ *tri_indices_run=i+3*4096; //strip\r
+ tri_indices_run++;\r
+ *tri_indices_run=i+3*4096; //strip\r
tri_indices_run++;\r
- *tri_indices_run=i+1+2*4096; //strip\r
+ *tri_indices_run=i+1+0*4096; //strip\r
tri_indices_run++;\r
}\r
+\r
+\r
+\r
+\r
+\r
glBufferData(GL_ELEMENT_ARRAY_BUFFER,4096*6*sizeof(GLushort),tri_indices,GL_STREAM_DRAW);\r
free(tri_indices);\r
\r
int GLMocoShader::deinit()\r
{\r
glDeleteFramebuffers(1, &frame_buf);\r
- glDeleteTextures(1, &frame_buf);\r
+ glDeleteTextures(1, &data_blocks);\r
return deinitShaders();\r
}\r
\r
+\r
+\r
int GLMocoShader::uploadDataBlocks(short* blocks,unsigned int num_blocks, XvMCMacroBlock *m_blocks,unsigned int num_m_blocks)\r
{\r
- unsigned int height=(num_blocks+127)/128;\r
+ unsigned int height=(num_blocks)/(BLOCK_PER_ROW);\r
\r
glBindTexture(GL_TEXTURE_2D, data_blocks);\r
glPixelStorei(GL_UNPACK_ALIGNMENT,1);\r
\r
+\r
+\r
+\r
+ Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark1 glerror %x %d",glGetError(),height);\r
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,\r
- 1024,height,\r
- GL_LUMINANCE,GL_UNSIGNED_BYTE,\r
+ BLOCK_TEXTURE_WIDTH>>1,height,\r
+ GL_RGBA,GL_UNSIGNED_BYTE,\r
blocks);\r
- //Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark2 glerror %x",glGetError());\r
+ Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark2 glerror %x",glGetError());\r
+ glTexSubImage2D(GL_TEXTURE_2D,0,0,height+1,\r
+ (num_blocks%BLOCK_PER_ROW)>>1,1,\r
+ GL_RGBA,GL_UNSIGNED_BYTE,\r
+ blocks);\r
+\r
+ Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark2 glerror %x",glGetError());\r
+\r
+\r
+\r
+ glBindTexture(GL_TEXTURE_2D, 0);\r
\r
valid_macro_blocks=num_m_blocks;\r
glBindBuffer(GL_ARRAY_BUFFER,macro_block);\r
XvMCMacroBlock *m_blocks_run=m_blocks;\r
XvMCMacroBlock *m_blocks_end=m_blocks+num_m_blocks;\r
while (m_blocks_run!=m_blocks_end) {\r
- m_blocks_run->pad0=0x0000;\r
+ m_blocks_run->pad0=0xFF00;\r
m_blocks_run++;\r
}\r
- glBufferSubData(GL_ARRAY_BUFFER, 0, num_m_blocks * sizeof(XvMCMacroBlock),\r
+ // debug\r
+/* m_blocks[0].x=0;\r
+ m_blocks[0].y=0;\r
+ m_blocks[3]=m_blocks[2]=m_blocks[1]=m_blocks[0];\r
+ m_blocks[0].pad0=0xFF00;\r
+ m_blocks[1].pad0=0xFFFF;\r
+ m_blocks[2].pad0=0x0000;\r
+ m_blocks[3].pad0=0x00FF;\r
+ m_blocks[1].x=0;\r
+ m_blocks[1].y=0;\r
+ m_blocks[2].x=0;\r
+ m_blocks[2].y=0;\r
+ m_blocks[3].x=0;\r
+ m_blocks[3].y=0;*/\r
+\r
+ glBufferSubData(GL_ARRAY_BUFFER, 0* sizeof(XvMCMacroBlock), num_m_blocks * sizeof(XvMCMacroBlock),\r
m_blocks);\r
\r
+\r
m_blocks_run = m_blocks;\r
m_blocks_end = m_blocks + num_m_blocks;\r
while (m_blocks_run != m_blocks_end) {\r
- m_blocks_run->pad0 = 0x00FF;\r
+ m_blocks_run->pad0 = 0xFFFF;\r
m_blocks_run++;\r
}\r
- glBufferSubData(GL_ARRAY_BUFFER, 4096, num_m_blocks * sizeof(XvMCMacroBlock),\r
+ glBufferSubData(GL_ARRAY_BUFFER, 4096* sizeof(XvMCMacroBlock), num_m_blocks * sizeof(XvMCMacroBlock),\r
m_blocks);\r
\r
+\r
m_blocks_run = m_blocks;\r
m_blocks_end = m_blocks + num_m_blocks;\r
while (m_blocks_run != m_blocks_end) {\r
- m_blocks_run->pad0 = 0xFF00;\r
+ m_blocks_run->pad0 = 0x0000;\r
m_blocks_run++;\r
}\r
- glBufferSubData(GL_ARRAY_BUFFER, 2 * 4096,\r
+ glBufferSubData(GL_ARRAY_BUFFER, 2 * 4096* sizeof(XvMCMacroBlock),\r
num_m_blocks * sizeof(XvMCMacroBlock), m_blocks);\r
\r
+\r
m_blocks_run = m_blocks;\r
m_blocks_end = m_blocks + num_m_blocks;\r
while (m_blocks_run != m_blocks_end) {\r
- m_blocks_run->pad0 = 0xFFFF;\r
+ m_blocks_run->pad0 = 0x00FF;\r
m_blocks_run++;\r
}\r
- glBufferSubData(GL_ARRAY_BUFFER, 3 * 4096,\r
+ glBufferSubData(GL_ARRAY_BUFFER, 3 * 4096* sizeof(XvMCMacroBlock),\r
num_m_blocks * sizeof(XvMCMacroBlock), m_blocks);\r
\r
\r
\r
}\r
\r
-int GLMocoShader::doMoCo(VPEOGLFrame *target, VPE_FrameBuf* source)\r
+int GLMocoShader::doMoCo(VPEOGLFrame *target)\r
{\r
\r
+// Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark-2 glerror %x %x",glGetError(),frame_buf);\r
+\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark-1 glerror %x %x",glGetError(),frame_buf);\r
glBindFramebuffer(GL_FRAMEBUFFER, frame_buf);\r
- Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark1 glerror %x",glGetError());\r
+ Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark1 glerror %x %x %x",glGetError(),target->textures[0],target->textures[1]);\r
+\r
+\r
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,\r
GL_TEXTURE_2D, target->textures[0], 0);\r
- Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark2 glerror %x",glGetError());\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark1apres glerror %x",glGetError());\r
+\r
+\r
+\r
+\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark2 glerror %x",glGetError());\r
+\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark2a glerror %x",glGetError());\r
\r
int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\r
if (status == GL_FRAMEBUFFER_COMPLETE) {\r
+ glViewport(0, 0, target->width,target->height);\r
+ // Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark2b glerror %x",glGetError());\r
+\r
+ XvMCMacroBlock * helperp=NULL;\r
+\r
+ glClearColor(0.0f,0.5f,0.5f,1.f); //this black\r
+ glClear(GL_COLOR_BUFFER_BIT);\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark2c glerror %x",glGetError());\r
+\r
glUseProgram(shad_program);\r
- Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark3 glerror %x",glGetError());\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark3 glerror %x",glGetError());\r
+\r
+\r
+ const GLfloat pict_scale[]={ 32./((float)target->width),32./((float)target->height)};\r
+\r
+ glUniform2fv(loc_pict_scale,1,(const GLfloat*)&pict_scale);\r
+\r
+\r
+\r
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,triangles);\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark5 glerror %x",glGetError());\r
+ glBindBuffer(GL_ARRAY_BUFFER,macro_block);\r
\r
\r
+\r
+ glVertexAttribPointer(0, 2, GL_SHORT, GL_FALSE,\r
+ sizeof(XvMCMacroBlock), NULL);\r
+\r
+ glEnableVertexAttribArray(0);\r
+\r
+ glVertexAttribPointer(1, 2, GL_UNSIGNED_BYTE, GL_TRUE,sizeof(XvMCMacroBlock), (const void *) &(helperp->pad0));\r
+ glEnableVertexAttribArray(1);\r
+\r
+ glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_FALSE,sizeof(XvMCMacroBlock), (const void *) &(helperp->macroblock_type));\r
+ glEnableVertexAttribArray(2);\r
+\r
+ glVertexAttribPointer(3, 1, GL_SHORT, GL_FALSE,sizeof(XvMCMacroBlock), (const void *) &(helperp->coded_block_pattern));\r
+ glEnableVertexAttribArray(3);\r
+ glVertexAttribPointer(4, 2, GL_UNSIGNED_SHORT, GL_FALSE,sizeof(XvMCMacroBlock), (const void *) &(helperp->index));\r
+ glEnableVertexAttribArray(4);\r
+\r
+\r
+ glActiveTexture(GL_TEXTURE0);\r
+ glBindTexture(GL_TEXTURE_2D,data_blocks);\r
+ glUniform1i(blocks_loc,0);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);\r
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);\r
+\r
+ glDrawElements(GL_TRIANGLE_STRIP, valid_macro_blocks*6,\r
+ GL_UNSIGNED_SHORT, NULL);\r
+\r
+\r
+ /*\r
+ glVertexAttribPointer(0, 2, GL_SHORT, GL_FALSE,sizeof(XvMCMacroBlock), 0);\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark3 glerror %x",glGetError());\r
+ glEnableVertexAttribArray(0);\r
+\r
+ glVertexAttribPointer(1, 2, GL_UNSIGNED_BYTE, GL_TRUE,sizeof(XvMCMacroBlock), (const void *) &(helperp->pad0));\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark3 glerror %x",glGetError());\r
+ glEnableVertexAttribArray(1);*/\r
+\r
+ // Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark4 glerror %x",glGetError());\r
+\r
+\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark6 glerror %x",glGetError());\r
+\r
+ // glDrawElements(GL_TRIANGLE_STRIP,/*valid_macro_blocks*/4,GL_UNSIGNED_SHORT,0);\r
+ Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark7 glerror %x %x",glGetError(),valid_macro_blocks);\r
+ //cleanup\r
+\r
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark5 glerror %x",glGetError());\r
glBindBuffer(GL_ARRAY_BUFFER,0);\r
+\r
glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
+ glBindTexture(GL_TEXTURE_2D, 0);\r
+ //Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo mark8 glerror %x",glGetError());\r
} else {\r
glBindFramebuffer(GL_FRAMEBUFFER, 0);\r
- Log::getInstance()->log("GLMocoShader", Log::WARN, "framebuffer not complete");\r
+ Log::getInstance()->log("GLMocoShader", Log::WARN, "framebuffer not complete %x",status);\r
return -1;\r
}\r
+\r
+ glFinish(); // since the main rendering is done in a different thread we have to make sure rendering is finished before passing the texture\r
+ // call this only in the last stage of rendering the moco frame\r
return 0;\r
\r
\r
\r
int GLMocoShader::BindAttributes()\r
{\r
- glBindAttribLocation(shad_program,0,"vec_pos");\r
- glBindAttribLocation(shad_program,1,"tex_coord");\r
+ glBindAttribLocation(shad_program,0,"block_pos");\r
+ glBindAttribLocation(shad_program,1,"block_edge");\r
+ glBindAttribLocation(shad_program,2,"block_types");\r
+ glBindAttribLocation(shad_program,3,"cbp");\r
+ glBindAttribLocation(shad_program,4,"index");\r
+ //glBindAttribLocation(shad_program,1,"tex_coord");\r
return 1;\r
}\r