Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef rGL_glDrawElementsInstanced_replace
- 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};
- int rGL_glDrawElementsInstanced( void *p ){
- struct rGL_glDrawElementsInstanced_s *rglp = (struct rGL_glDrawElementsInstanced_s*) p;
- int i;
- TRACE("(%d, %d, %d, %p)\n", rglp->mode, rglp->count, rglp->type, rglp->indices);
- 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 );
- for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]) ;i++)
- if(rglp->m[i]!=NULL)
- free(rglp->m[i]);
- if(rglp->indices_size > MAX_BUFFER_OBJECT && rglp->indices != NULL) free(rglp->indices);
- return sizeof(struct rGL_glDrawElementsInstanced_s)+(rglp->indices != NULL ? (rglp->indices_size > MAX_BUFFER_OBJECT ?0:rglp->indices_size) : 0);
- }
- void WINAPI wine_glDrawElementsInstanced( GLenum mode, GLsizei count, GLenum type, GLvoid* indices , GLsizei primcount) {
- struct rGL_glDrawElementsInstanced_s *rglp;
- struct rGL_glVertexAttribPointerARB_s *rglp2;
- int i,j,k;
- unsigned int l,l_min,l_max;
- GLvoid *m;
- RGL_THREAD_INIT
- RGL_TRACE; TRACE("(%d, %d, %d, %p)\n", mode, count, type, indices );
- if(tss != NULL){
- l_min=(2>>31)-1; l_max=0;
- if(css->rgl_GL_ARRAY_BUFFER==0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER==0){
- switch(type){
- 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;
- 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;
- 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;
- default: WINE_FIXME("not valid type %x\n",type); exit(0); }
- j=0; m=(GLvoid*)-1;
- for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
- if(!css->rgl_glVertexAttrib[i].flag) continue;
- if(css->rgl_glVertexAttrib[i].stride != css->rgl_glVertexAttrib[0].stride || \
- abs((GLbyte*)css->rgl_glVertexAttrib[i].pointer-(GLbyte*)css->rgl_glVertexAttrib[0].pointer) > css->rgl_glVertexAttrib[0].stride){j=-1; break;}
- if((GLvoid*)css->rgl_glVertexAttrib[i].pointer<m) m=(GLvoid*)css->rgl_glVertexAttrib[i].pointer;
- j++; }
- if(j>0){
- css->rgl_glVertexAttrib[0].m=malloc((l_max-l_min+1)*css->rgl_glVertexAttrib[0].stride);
- 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); }
- for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
- if(!css->rgl_glVertexAttrib[i].flag) continue;
- rglp2 = (struct rGL_glVertexAttribPointerARB_s*)(tss->rGLbuf+sizeof(GLushort));
- *(GLushort*)tss->rGLbuf = rGL_glVertexAttribPointerARB_t;
- rglp2->index=i; rglp2->size=css->rgl_glVertexAttrib[i].size; rglp2->type=css->rgl_glVertexAttrib[i].type; rglp2->normalized=css->rgl_glVertexAttrib[i].normalized;
- rglp2->stride=css->rgl_glVertexAttrib[i].stride;
- if(j>0) rglp2->pointer=(GLint)((GLbyte*)css->rgl_glVertexAttrib[i].pointer-(GLbyte*)m+(GLbyte*)css->rgl_glVertexAttrib[0].m);
- else{
- m=malloc((l_max-l_min+1)*css->rgl_glVertexAttrib[0].stride); css->rgl_glVertexAttrib[i].m=m; rglp2->pointer=(GLuint)m;
- 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); }
- tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glVertexAttribPointerARB_s); }
- rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=0;
- 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;
- 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; }
- glDrawElementsInstanced_compsize
- if(indices != NULL){
- if(rglp->indices_size > MAX_BUFFER_OBJECT) m=rglp->indices=malloc(rglp->indices_size);
- else m=(GLbyte*)rglp+sizeof(struct rGL_glDrawElementsInstanced_s);
- memcpy(m,indices,rglp->indices_size);
- if(css->rgl_GL_ARRAY_BUFFER==0 && l_min!=0)
- switch(type){
- case GL_UNSIGNED_BYTE: for(k=0;k<count;k++) *((GLubyte*)m+k)-=(GLubyte)l_min; break;
- case GL_UNSIGNED_SHORT: for(k=0;k<count;k++) *((GLushort*)m+k)-=(GLushort)l_min; break;
- case GL_UNSIGNED_INT: for(k=0;k<count;k++) *((GLuint*)m+k)-=(GLuint)l_min; break;
- default: WINE_FIXME("not valid type %x\n",type); exit(0); }
- }
- tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s)+(rglp->indices != NULL ? (rglp->indices_size > MAX_BUFFER_OBJECT ?0:rglp->indices_size) : 0);
- RGL_CHECK_BUFFER
- }
- else if(css->rgl_GL_ARRAY_BUFFER==0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER!=0){
- for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
- if(!css->rgl_glVertexAttrib[i].flag) continue;
- rglp2 = (struct rGL_glVertexAttribPointerARB_s*)(tss->rGLbuf+sizeof(GLushort));
- *(GLushort*)tss->rGLbuf = rGL_glVertexAttribPointerARB_t;
- rglp2->index=i; rglp2->size=css->rgl_glVertexAttrib[i].size; rglp2->type=css->rgl_glVertexAttrib[i].type; rglp2->normalized=css->rgl_glVertexAttrib[i].normalized;
- rglp2->stride=css->rgl_glVertexAttrib[i].stride; rglp2->pointer=css->rgl_glVertexAttrib[i].pointer;
- tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glVertexAttribPointerARB_s);
- }
- rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=1; rglp->indices_size=0;
- 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;
- tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s);
- rGLSync();
- rGLSync();
- }
- else if(css->rgl_GL_ARRAY_BUFFER!=0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER==0){
- rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=2;
- 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;
- glDrawElementsInstanced_compsize
- if(indices != NULL){
- if(rglp->indices_size > MAX_BUFFER_OBJECT) m=rglp->indices=malloc(rglp->indices_size);
- else m=(GLbyte*)rglp+sizeof(struct rGL_glDrawElementsInstanced_s);
- memcpy(m,indices,rglp->indices_size);
- }
- tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s)+(rglp->indices != NULL ? (rglp->indices_size > MAX_BUFFER_OBJECT ?0:rglp->indices_size) : 0);
- RGL_CHECK_BUFFER
- }
- else { /* if(css->rgl_GL_ARRAY_BUFFER!=0 && css->rgl_GL_ELEMENT_ARRAY_BUFFER!=0) */
- /* for(i=0;i<sizeof(css->rgl_glVertexAttrib)/sizeof(css->rgl_glVertexAttrib[0]);i++){
- if(!css->rgl_glVertexAttrib[i].flag) continue;
- rglp2 = (struct rGL_glVertexAttribPointerARB_s*)(tss->rGLbuf+sizeof(GLushort));
- *(GLushort*)tss->rGLbuf = rGL_glVertexAttribPointerARB_t;
- rglp2->index=i; rglp2->size=css->rgl_glVertexAttrib[i].size; rglp2->type=css->rgl_glVertexAttrib[i].type; rglp2->normalized=css->rgl_glVertexAttrib[i].normalized;
- rglp2->stride=css->rgl_glVertexAttrib[i].stride; rglp2->pointer=css->rgl_glVertexAttrib[i].pointer;
- tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glVertexAttribPointerARB_s);
- } */
- rglp = (struct rGL_glDrawElementsInstanced_s*)(tss->rGLbuf+sizeof(GLushort)); *(GLushort*)tss->rGLbuf = rGL_glDrawElementsInstanced_t; rglp->rgl_flag=3; rglp->indices_size=0;
- 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;
- tss->rGLbuf += sizeof(GLushort)+sizeof(struct rGL_glDrawElementsInstanced_s);
- RGL_CHECK_BUFFER
- }
- }
- else{
- ENTER_GL();
- glDrawElementsInstanced( mode, count, type, indices, primcount );
- LEAVE_GL();
- }
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement