"void main()\n"\r
"{\n"\r
// calculate cbp\r
- " vec4 cbp_vec=vec4(cbp,cbp,cbp,cbp);\n"\r
+ //" vec4 cbp_vec=vec4(cbp,cbp,cbp,cbp);\n"\r
\r
// old cbp code\r
// " vec4 fmod_cbp_y=mod(cbp_vec,y_cbp);\n"\r
- // " vec2 fmod_cbp_uv=mod(cbp_vec.xy,uv_cbp);\n"\r
+ // " vec2 fmod_cbp_uv=mod(cbp_vec.xy,uv_cbp.xy);\n"\r
// " fmod_cbp_y.x=0.;\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
\r
-\r
- " vec4 fmod_cbp_y=mod(cbp_vec,vec4(uv_cbp.zyx,y_cbp.w));\n"\r
+//this code is better but nor really working\r
+ /* " vec4 fmod_cbp_y=mod(cbp_vec,vec4(uv_cbp.zyx,y_cbp.w));\n"\r
" vec2 fmod_cbp_uv=mod(cbp_vec.xy,y_cbp.zy);\n"\r
" fmod_cbp_y=vec4(lessThanEqual(vec4(uv_cbp.yx,y_cbp.wz),fmod_cbp_y));\n"\r
" fmod_cbp_uv=vec2(lessThanEqual(y_cbp.yx,fmod_cbp_uv));\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
+ " fmod_cbp_uv2.y+=fmod_cbp_uv2.x;\n"*/\r
+\r
+\r
+ " float tcbp=cbp;\n"\r
+ " float tpos=czero;\n"\r
+ " vec4 fmod_cbp_y=vec4(czero,czero,czero,czero);\n"\r
+ " vec2 fmod_cbp_uv=vec2(czero,czero);\n"\r
+ " vec4 fmod_cbp_y2=vec4(czero,czero,czero,czero);\n"\r
+ " vec2 fmod_cbp_uv2=vec2(czero,czero);\n"\r
+ " if (tcbp>=uv_cbp.y){\n"\r
+ " fmod_cbp_y.x=one;\n"\r
+ " fmod_cbp_y2.x=tpos;\n"\r
+ " tpos++;\n"\r
+ " tcbp-=uv_cbp.y;\n"\r
+ " }\n"\r
+ " if (tcbp>=uv_cbp.x){\n"\r
+ " fmod_cbp_y.y=one;\n"\r
+ " fmod_cbp_y2.y=tpos;\n"\r
+ " tpos++;\n"\r
+ " tcbp-=uv_cbp.x;\n"\r
+ " }\n"\r
+ " if (tcbp>=y_cbp.w){\n"\r
+ " fmod_cbp_y.z=one;\n"\r
+ " fmod_cbp_y2.z=tpos;\n"\r
+ " tpos++;\n"\r
+ " tcbp-=y_cbp.w;\n"\r
+ " }\n"\r
+ " if (tcbp>=y_cbp.z){\n"\r
+ " fmod_cbp_y.w=one;\n"\r
+ " fmod_cbp_y2.w=tpos;\n"\r
+ " tpos++;\n"\r
+ " tcbp-=y_cbp.z;\n"\r
+ " }\n"\r
+ " if (tcbp>=y_cbp.y){\n"\r
+ " fmod_cbp_uv.x=one;\n"\r
+ " fmod_cbp_uv2.x=tpos;\n"\r
+ " tpos++;\n"\r
+ " tcbp-=y_cbp.y;\n"\r
+ " }\n"\r
+ " if (tcbp>=y_cbp.x){\n"\r
+ " fmod_cbp_uv.y=one;\n"\r
+ " fmod_cbp_uv2.y=tpos;\n"\r
+ // " tpos++;\n"\r
+ // " tcbp-=y_cbp.y;\n"\r
+ " }\n"\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
\r
// now calculate their position inside the short array\r
- " float m_index=index.x/*+index.y*c65536*/-one;\n" //Not Endian save\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
" out_yblockpos_y=floor((fmod_cbp_y2)*c1over32);\n"\r
" out_uvblockpos_xy.zw=floor((fmod_cbp_uv2)*c1over32);\n"\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
- " out_yblockpos_y=mix(vec4(c1024,c1024,c1024,c1024)-one,out_yblockpos_y,fmod_cbp_y);\n"\r
- " out_uvblockpos_xy.zw=mix(vec2(c1024,c1024)-one,out_uvblockpos_xy.zw,fmod_cbp_uv);\n"\r
+ " out_yblockpos_y=mix(vec4(c1024,c1024,c1024,c1024),out_yblockpos_y,fmod_cbp_y);\n"\r
+ " out_uvblockpos_xy.zw=mix(vec2(c1024,c1024),out_uvblockpos_xy.zw,fmod_cbp_uv);\n"\r
\r
\r
// set start positions\r
- " vec4 motion_vertical=vec4(block_types.z,block_types.z,block_types.z,block_types.z);\n"\r
- " vec4 mod_motion_vertical=mod(motion_vertical,y_cbp);\n"\r
- " mod_motion_vertical=sign(vec4(mod_motion_vertical.yzw,block_types.z)-mod_motion_vertical);\n"\r
+ // " vec4 motion_vertical=vec4(block_types.z,block_types.z,block_types.z,block_types.z);\n"\r
+ // " vec4 mod_motion_vertical=mod(motion_vertical,vec4(y_cbp.yzw,uv_cbp.x));\n"\r
+ // " mod_motion_vertical=vec4(lessThanEqual(y_cbp,mod_motion_vertical));\n"\r
\r
" out_moco_pos.xy=(block_pos.xy+block_edge.xy)*uv_cbp.x/*16*/+one;"\r
" out_unsupported=czero;\n"\r
" out_moco_backward=vec4(PMV1.zw,PMV1.zw);\n"\r
//" out_unsupported=2.;\n"\r
" } else if (block_types.y==y_cbp.x /*1*/) {" //Field\r
- " out_moco_forward=vec4(PMV1.xy,PMV1.xy);\n"\r
- " out_moco_backward=vec4(PMV1.zw,PMV1.zw);\n"\r
- " out_moco_forward.y+=mod_motion_vertical.x;\n"\r
+ " out_moco_forward=vec4(PMV1.xy,PMV2.xy);\n"\r
+ " out_moco_backward=vec4(PMV1.zw,PMV2.zw);\n"\r
+\r
+ " float motion_vert=block_types.z;\n"\r
+ " out_moco_forward.w-=one;\n"\r
+ " out_moco_backward.w-=one;\n"\r
+ " if (motion_vert>= y_cbp.w) {\n" //second_backward\r
+ " motion_vert-=y_cbp.w;\n"\r
+ " out_moco_backward.w+=one;\n"\r
+ " }\n"\r
+ " if (motion_vert>= y_cbp.z) {\n" //second_forward\r
+ " motion_vert-=y_cbp.z;\n"\r
+ " out_moco_forward.w+=one;\n"\r
+ " }\n"\r
+ " if (motion_vert>= y_cbp.y) {\n" //first_backward\r
+ " motion_vert-=y_cbp.y;\n"\r
+ " out_moco_backward.y+=one;\n"\r
+ " }\n"\r
+ " if (motion_vert>= y_cbp.x) {\n" //second_forward\r
+ //" motion_vert-=y_cbp.z;\n"\r
+ " out_moco_forward.y+=one;\n"\r
+ " }\n"\r
+ /* " out_moco_forward.y+=mod_motion_vertical.x;\n"\r
" out_moco_backward.y+=mod_motion_vertical.y;\n"\r
" out_moco_forward.w-=one-mod_motion_vertical.z;\n"\r
- " out_moco_backward.w-=one-mod_motion_vertical.w;\n"\r
+ " out_moco_backward.w-=one-mod_motion_vertical.w;\n"*/\r
" out_misc_info.y=one;\n" // step to for field based\r
// " out_unsupported=2.;\n"\r
" } else {\n"\r
" out_unsupported=1.;\n"\r
" }\n"\r
" }\n"\r
+ // " if (cbp==63. || cbp==0.) out_unsupported=2.;\n"\r
+ // " if (fmod_cbp_y.w==1. && mod(cbp,8.)>=4.) out_unsupported=2.;\n"\r
\r
\r
\r
\r
\r
\r
-// Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark1 glerror %x %d",glGetError(),height);\r
+ Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks mark1 %d %d %d",height,num_blocks,num_m_blocks);\r
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,\r
BLOCK_TEXTURE_WIDTH>>1,height,\r
GL_RGBA,GL_UNSIGNED_BYTE,\r
XvMCMacroBlock *m_blocks_end=m_blocks+num_m_blocks;\r
while (m_blocks_run!=m_blocks_end) {\r
m_blocks_run->pad0=0xFF00;\r
+ // Log::getInstance()->log("GLMocoShader", Log::WARN, "uploadDataBlocks coded block %x %x %d",\r
+ // m_blocks_run->coded_block_pattern, m_blocks_run->macroblock_type,m_blocks_run->index);\r
m_blocks_run++;\r
+\r
}\r
// debug\r
/* m_blocks[0].x=0;\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
+ glVertexAttribPointer(3, 1, GL_UNSIGNED_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
if (forward) {\r
- Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo forward %x",forward->textures[0]);\r
+ // Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo forward %x",forward->textures[0]);\r
glActiveTexture(GL_TEXTURE1);\r
glBindTexture(GL_TEXTURE_2D,forward->textures[0]);\r
glUniform1i(forward_pic_loc,1);\r
\r
if (backward) {\r
glActiveTexture(GL_TEXTURE2);\r
- Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo backward %x",backward->textures[0]);\r
+ // Log::getInstance()->log("GLMocoShader", Log::WARN, "doMoCo backward %x",backward->textures[0]);\r
glBindTexture(GL_TEXTURE_2D,backward->textures[0]);\r
glUniform1i(backward_pic_loc,2);\r
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);\r