mirror of
https://github.com/YGGverse/xash3d-fwgs.git
synced 2025-01-12 16:18:01 +00:00
gl2shim: implement fallback vbo, glDrawRangeElements with non-vbo buffer works now on core contexts
This commit is contained in:
parent
74a2dbeb91
commit
724c29d711
@ -920,7 +920,7 @@ typedef struct gl2wrap_arraypointer_s
|
||||
GLint size;
|
||||
GLenum type;
|
||||
GLsizei stride;
|
||||
GLuint vbo;
|
||||
GLuint vbo, vbo_fb;
|
||||
} gl2wrap_arraypointer_t;
|
||||
|
||||
static struct
|
||||
@ -996,8 +996,11 @@ static void GL2_SetupArrays( GLuint start, GLuint end )
|
||||
if ( fogging )
|
||||
flags |= 1 << GL2_FLAG_FOG;
|
||||
prog = GL2_SetProg( flags );// | GL2_ATTR_TEXCOORD0 );
|
||||
if(!prog)
|
||||
return;
|
||||
if( gl2wrap.vao )
|
||||
pglBindVertexArray( gl2wrap.vao );
|
||||
|
||||
for( int i = 0; i < GL2_ATTR_MAX; i++ )
|
||||
{
|
||||
if(prog->attridx[i] < 0)
|
||||
@ -1005,8 +1008,37 @@ static void GL2_SetupArrays( GLuint start, GLuint end )
|
||||
if( flags & (1 << i) )
|
||||
{
|
||||
pglEnableVertexAttribArrayARB( prog->attridx[i] );
|
||||
if( gl2wrap.vao && !gl2wrap_arrays.ptr[i].vbo )
|
||||
{
|
||||
// detect stride by type
|
||||
int stride = gl2wrap_arrays.ptr[i].stride;
|
||||
if( stride == 0 )
|
||||
{
|
||||
if( gl2wrap_arrays.ptr[i].type == GL_UNSIGNED_BYTE )
|
||||
stride = gl2wrap_arrays.ptr[i].size;
|
||||
else
|
||||
stride = gl2wrap_arrays.ptr[i].size * 4;
|
||||
}
|
||||
|
||||
if( !gl2wrap_arrays.ptr[i].vbo_fb )
|
||||
pglGenBuffersARB( 1, &gl2wrap_arrays.ptr[i].vbo_fb );
|
||||
rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap_arrays.ptr[i].vbo_fb );
|
||||
if(!end)
|
||||
{
|
||||
pglDisableVertexAttribArrayARB( prog->attridx[i] );
|
||||
gEngfuncs.Con_Printf(S_ERROR "NON-vbo array for DrawElements call, SKIPPING!\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
pglBufferDataARB( GL_ARRAY_BUFFER_ARB, end * stride, gl2wrap_arrays.ptr[i].userptr, GL_STREAM_DRAW_ARB );
|
||||
pglVertexAttribPointerARB( prog->attridx[i], gl2wrap_arrays.ptr[i].size, gl2wrap_arrays.ptr[i].type, i == GL2_ATTR_COLOR, gl2wrap_arrays.ptr[i].stride, 0 );
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
rpglBindBufferARB( GL_ARRAY_BUFFER_ARB, gl2wrap_arrays.ptr[i].vbo );
|
||||
pglVertexAttribPointerARB( prog->attridx[i], gl2wrap_arrays.ptr[i].size, gl2wrap_arrays.ptr[i].type, i == GL2_ATTR_COLOR, gl2wrap_arrays.ptr[i].stride, gl2wrap_arrays.ptr[i].userptr );
|
||||
}
|
||||
/*
|
||||
if(i == GL2_ATTR_TEXCOORD0)
|
||||
pglUniform1iARB( prog->utex0, 0 );
|
||||
|
Loading…
Reference in New Issue
Block a user