Advertisement
Guest User

Untitled

a guest
Nov 5th, 2011
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.69 KB | None | 0 0
  1. #ifdef rGL_glDrawElementsInstanced_replace
  2. struct rGL_glDrawElementsInstanced_s{GLenum mode; GLsizei count; GLenum type; GLvoid* indices; GLuint indices_size; GLint rgl_flag; GLvoid *m[sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0])]; GLsizei primcount};
  3. int rGL_glDrawElementsInstanced( void *p ){
  4.   struct rGL_glDrawElementsInstanced_s *rglp = (struct rGL_glDrawElementsInstanced_s*) p;
  5.   int i;
  6.   TRACE("(%d, %d, %d, %p)\n", rglp->mode, rglp->count, rglp->type, rglp->indices);
  7.   glDrawElementsInstanced( rglp->mode, rglp->count, rglp->type, (rglp->indices_size > MAX_BUFFER_OBJECT || rglp->indices == NULL?rglp->indices:(GLvoid*)((GLbyte*)rglp+sizeof(struct rGL_glDrawElements_s)) ), rglp->primcount  );
  8.   for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]) ;i++)
  9.     if(rglp->m[i]!=NULL)
  10.         free(rglp->m[i]);
  11.   if(rglp->indices_size > MAX_BUFFER_OBJECT && rglp->indices != NULL) free(rglp->indices);
  12.   return sizeof(struct rGL_glDrawElementsInstanced_s)+(rglp->indices != NULL ? (rglp->indices_size > MAX_BUFFER_OBJECT ?0:rglp->indices_size) : 0);
  13.   }
  14.  
  15. void WINAPI wine_glDrawElementsInstanced( GLenum mode, GLsizei count, GLenum type, GLvoid* indices ,  GLsizei primcount) {
  16.   struct rGL_glDrawElementsInstanced_s *rglp;
  17.   struct rGL_glVertexAttribPointerARB_s *rglp2;
  18.   int i,j,k;
  19.   unsigned int l,l_min,l_max;
  20.   GLvoid *m;
  21.   RGL_THREAD_INIT
  22.   RGL_TRACE; TRACE("(%d, %d, %d, %p)\n", mode, count, type, indices );
  23.   if(tss != NULL){
  24.     l_min=(2>>31)-1; l_max=0;
  25.     if(css->rgl_GL_ARRAY_BUFFER==0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER==0){
  26.     switch(type){
  27.         case GL_UNSIGNED_BYTE:  for(k=0;k<count;k++){l=*((GLubyte*)indices+k);  if( l>l_max ) l_max=l; if( l<l_min ) l_min=l; } break;
  28.         case GL_UNSIGNED_SHORT: for(k=0;k<count;k++){l=*((GLushort*)indices+k); if( l>l_max ) l_max=l; if( l<l_min ) l_min=l; } break;
  29.         case GL_UNSIGNED_INT:   for(k=0;k<count;k++){l=*((GLuint*)indices+k);   if( l>l_max ) l_max=l; if( l<l_min ) l_min=l; } break;
  30.         default: WINE_FIXME("not valid type %x\n",type); exit(0); }
  31.     j=0; m=(GLvoid*)-1;
  32.     for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
  33.         if(!css->rgl_glVertexAttrib[i].flag) continue;
  34.         if(css->rgl_glVertexAttrib[i].stride != css->rgl_glVertexAttrib[0].stride || \
  35.         abs((GLbyte*)css->rgl_glVertexAttrib[i].pointer-(GLbyte*)css->rgl_glVertexAttrib[0].pointer) > css->rgl_glVertexAttrib[0].stride){j=-1; break;}
  36.         if((GLvoid*)css->rgl_glVertexAttrib[i].pointer<m) m=(GLvoid*)css->rgl_glVertexAttrib[i].pointer;
  37.         j++; }
  38.     if(j>0){
  39.         css->rgl_glVertexAttrib[0].m=malloc((l_max-l_min+1)*css->rgl_glVertexAttrib[0].stride);
  40.         memcpy(css->rgl_glVertexAttrib[0].m,(GLbyte*)m+l_min*css->rgl_glVertexAttrib[0].stride,(l_max-l_min+1)*css->rgl_glVertexAttrib[0].stride); }
  41.     for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
  42.         if(!css->rgl_glVertexAttrib[i].flag) continue;
  43.         rglp2 = (struct rGL_glVertexAttribPointerARB_s*)(tss->rGLbuf+sizeof(GLushort));
  44.         *(GLushort*)tss->rGLbuf = rGL_glVertexAttribPointerARB_t;
  45.         rglp2->index=i; rglp2->size=css->rgl_glVertexAttrib[i].size; rglp2->type=css->rgl_glVertexAttrib[i].type; rglp2->normalized=css->rgl_glVertexAttrib[i].normalized;
  46.         rglp2->stride=css->rgl_glVertexAttrib[i].stride;
  47.         if(j>0) rglp2->pointer=(GLint)((GLbyte*)css->rgl_glVertexAttrib[i].pointer-(GLbyte*)m+(GLbyte*)css->rgl_glVertexAttrib[0].m);
  48.         else{
  49.         m=malloc((l_max-l_min+1)*css->rgl_glVertexAttrib[0].stride); css->rgl_glVertexAttrib[i].m=m; rglp2->pointer=(GLuint)m;
  50.             memcpy(m,(GLbyte*)css->rgl_glVertexAttrib[i].pointer+l_min*css->rgl_glVertexAttrib[i].stride,(l_max-l_min+1)*css->rgl_glVertexAttrib[i].stride); }
  51.         tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glVertexAttribPointerARB_s); }
  52.         rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=0;
  53.         rglp->mode=mode; rglp->count=count; rglp->type=type; rglp->indices = indices; memset(rglp->m,0x0,sizeof(GLvoid*)*sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0])); rglp->primcount=primcount;
  54.     for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){ rglp->m[i]=css->rgl_glVertexAttrib[i].m; css->rgl_glVertexAttrib[i].m=NULL; }
  55. glDrawElementsInstanced_compsize
  56.     if(indices != NULL){
  57.         if(rglp->indices_size > MAX_BUFFER_OBJECT)  m=rglp->indices=malloc(rglp->indices_size);
  58.         else m=(GLbyte*)rglp+sizeof(struct rGL_glDrawElementsInstanced_s);
  59.         memcpy(m,indices,rglp->indices_size);
  60.         if(css->rgl_GL_ARRAY_BUFFER==0 && l_min!=0)
  61.         switch(type){
  62.             case GL_UNSIGNED_BYTE:  for(k=0;k<count;k++) *((GLubyte*)m+k)-=(GLubyte)l_min;   break;
  63.             case GL_UNSIGNED_SHORT: for(k=0;k<count;k++) *((GLushort*)m+k)-=(GLushort)l_min; break;
  64.             case GL_UNSIGNED_INT:   for(k=0;k<count;k++) *((GLuint*)m+k)-=(GLuint)l_min;     break;
  65.             default: WINE_FIXME("not valid type %x\n",type); exit(0); }
  66.         }
  67.     tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s)+(rglp->indices != NULL ? (rglp->indices_size > MAX_BUFFER_OBJECT ?0:rglp->indices_size) : 0);
  68.     RGL_CHECK_BUFFER
  69.     }
  70.     else if(css->rgl_GL_ARRAY_BUFFER==0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER!=0){
  71.     for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
  72.         if(!css->rgl_glVertexAttrib[i].flag) continue;
  73.         rglp2 = (struct rGL_glVertexAttribPointerARB_s*)(tss->rGLbuf+sizeof(GLushort));
  74.         *(GLushort*)tss->rGLbuf = rGL_glVertexAttribPointerARB_t;
  75.         rglp2->index=i; rglp2->size=css->rgl_glVertexAttrib[i].size; rglp2->type=css->rgl_glVertexAttrib[i].type; rglp2->normalized=css->rgl_glVertexAttrib[i].normalized;
  76.         rglp2->stride=css->rgl_glVertexAttrib[i].stride; rglp2->pointer=css->rgl_glVertexAttrib[i].pointer;
  77.         tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glVertexAttribPointerARB_s);
  78.         }
  79.         rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=1; rglp->indices_size=0;
  80.         rglp->mode=mode; rglp->count=count; rglp->type=type; rglp->indices = indices; memset(rglp->m,0x0,sizeof(GLvoid*)*sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0])); rglp->primcount=primcount;
  81.     tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s);
  82.     rGLSync();
  83.         rGLSync();
  84.     }
  85.     else if(css->rgl_GL_ARRAY_BUFFER!=0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER==0){
  86.         rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=2;
  87.         rglp->mode=mode; rglp->count=count; rglp->type=type; rglp->indices = indices; memset(rglp->m,0x0,sizeof(GLvoid*)*sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0])); rglp->primcount=primcount;
  88. glDrawElementsInstanced_compsize
  89.     if(indices != NULL){
  90.         if(rglp->indices_size > MAX_BUFFER_OBJECT) m=rglp->indices=malloc(rglp->indices_size);
  91.         else m=(GLbyte*)rglp+sizeof(struct rGL_glDrawElementsInstanced_s);
  92.         memcpy(m,indices,rglp->indices_size);
  93.         }
  94.     tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s)+(rglp->indices != NULL ? (rglp->indices_size > MAX_BUFFER_OBJECT ?0:rglp->indices_size) : 0);
  95.     RGL_CHECK_BUFFER
  96.     }
  97.     else { /* if(css->rgl_GL_ARRAY_BUFFER!=0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER!=0) */
  98. /*  for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
  99.         if(!css->rgl_glVertexAttrib[i].flag) continue;
  100.         rglp2 = (struct rGL_glVertexAttribPointerARB_s*)(tss->rGLbuf+sizeof(GLushort));
  101.         *(GLushort*)tss->rGLbuf = rGL_glVertexAttribPointerARB_t;
  102.         rglp2->index=i; rglp2->size=css->rgl_glVertexAttrib[i].size; rglp2->type=css->rgl_glVertexAttrib[i].type; rglp2->normalized=css->rgl_glVertexAttrib[i].normalized;
  103.         rglp2->stride=css->rgl_glVertexAttrib[i].stride; rglp2->pointer=css->rgl_glVertexAttrib[i].pointer;
  104.         tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glVertexAttribPointerARB_s);
  105.         } */
  106.         rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=3; rglp->indices_size=0;
  107.         rglp->mode=mode; rglp->count=count; rglp->type=type; rglp->indices = indices; memset(rglp->m,0x0,sizeof(GLvoid*)*sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0])); rglp->primcount=primcount;
  108.     tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s);
  109.     RGL_CHECK_BUFFER
  110.     }
  111.     }
  112.   else{
  113.     ENTER_GL();
  114.     glDrawElementsInstanced( mode, count, type, indices, primcount );
  115.     LEAVE_GL();
  116.     }
  117. }
  118. #endif
  119.  
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement