fixed a horrible bug on Windows AMD, scenes saved until now in this branch

are no longer valid :(
This commit is contained in:
reduz 2016-12-24 16:23:30 -03:00
parent 3adb42e217
commit 0d4abf2aa3
8 changed files with 40 additions and 16 deletions

View File

@ -42,7 +42,13 @@ RasterizerScene *RasterizerGLES3::get_scene() {
#define _EXT_DEBUG_SEVERITY_LOW_ARB 0x9148 #define _EXT_DEBUG_SEVERITY_LOW_ARB 0x9148
#define _EXT_DEBUG_OUTPUT 0x92E0 #define _EXT_DEBUG_OUTPUT 0x92E0
static void _gl_debug_print(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const GLvoid *userParam) #ifdef WINDOWS_ENABLED
#define GLAPIENTRY APIENTRY
#else
#define GLAPIENTRY
#endif
static void GLAPIENTRY _gl_debug_print(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const GLvoid *userParam)
{ {
if (type==_EXT_DEBUG_TYPE_OTHER_ARB) if (type==_EXT_DEBUG_TYPE_OTHER_ARB)

View File

@ -1337,6 +1337,7 @@ void RasterizerSceneGLES3::_render_geometry(RenderList::Element *e) {
if (s->index_array_len>0) { if (s->index_array_len>0) {
glDrawElements(gl_primitive[s->primitive],s->index_array_len, (s->array_len>=(1<<16))?GL_UNSIGNED_INT:GL_UNSIGNED_SHORT,0); glDrawElements(gl_primitive[s->primitive],s->index_array_len, (s->array_len>=(1<<16))?GL_UNSIGNED_INT:GL_UNSIGNED_SHORT,0);
storage->info.render_vertices_count+=s->index_array_len; storage->info.render_vertices_count+=s->index_array_len;
@ -1349,6 +1350,9 @@ void RasterizerSceneGLES3::_render_geometry(RenderList::Element *e) {
} }
} break; } break;
case VS::INSTANCE_MULTIMESH: { case VS::INSTANCE_MULTIMESH: {

View File

@ -2481,6 +2481,8 @@ void RasterizerStorageGLES3::mesh_add_surface(RID p_mesh,uint32_t p_format,VS::P
for(int i=0;i<VS::ARRAY_MAX;i++) { for(int i=0;i<VS::ARRAY_MAX;i++) {
attribs[i].index=i;
if (! (p_format&(1<<i) ) ) { if (! (p_format&(1<<i) ) ) {
attribs[i].enabled=false; attribs[i].enabled=false;
attribs[i].integer=false; attribs[i].integer=false;
@ -2489,7 +2491,6 @@ void RasterizerStorageGLES3::mesh_add_surface(RID p_mesh,uint32_t p_format,VS::P
attribs[i].enabled=true; attribs[i].enabled=true;
attribs[i].offset=stride; attribs[i].offset=stride;
attribs[i].index=i;
attribs[i].integer=false; attribs[i].integer=false;
switch(i) { switch(i) {
@ -2499,7 +2500,7 @@ void RasterizerStorageGLES3::mesh_add_surface(RID p_mesh,uint32_t p_format,VS::P
if (p_format&VS::ARRAY_FLAG_USE_2D_VERTICES) { if (p_format&VS::ARRAY_FLAG_USE_2D_VERTICES) {
attribs[i].size=2; attribs[i].size=2;
} else { } else {
attribs[i].size=3; attribs[i].size=(p_format&VS::ARRAY_COMPRESS_VERTEX)?4:3;
} }
if (p_format&VS::ARRAY_COMPRESS_VERTEX) { if (p_format&VS::ARRAY_COMPRESS_VERTEX) {
@ -2719,18 +2720,20 @@ void RasterizerStorageGLES3::mesh_add_surface(RID p_mesh,uint32_t p_format,VS::P
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,surface->index_id); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,surface->index_id);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,index_array_size,ir.ptr(),GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER,index_array_size,ir.ptr(),GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind
} }
//generate arrays for faster state switching //generate arrays for faster state switching
for(int i=0;i<2;i++) { for(int ai=0;ai<2;ai++) {
if (i==0) { if (ai==0) {
//for normal draw //for normal draw
glGenVertexArrays(1,&surface->array_id); glGenVertexArrays(1,&surface->array_id);
glBindVertexArray(surface->array_id); glBindVertexArray(surface->array_id);
glBindBuffer(GL_ARRAY_BUFFER,surface->vertex_id); glBindBuffer(GL_ARRAY_BUFFER,surface->vertex_id);
} else if (i==1) { } else if (ai==1) {
//for instancing draw (can be changed and no one cares) //for instancing draw (can be changed and no one cares)
glGenVertexArrays(1,&surface->instancing_array_id); glGenVertexArrays(1,&surface->instancing_array_id);
glBindVertexArray(surface->instancing_array_id); glBindVertexArray(surface->instancing_array_id);

View File

@ -872,7 +872,7 @@ vec3 voxel_cone_trace(sampler3D probe, vec3 cell_size, vec3 pos, vec3 ambient, b
dist += diameter * 0.5; dist += diameter * 0.5;
} }
color.rgb = mix(color.rgb,mix(ambient,color.rgb,alpha),blend_ambient); //color.rgb = mix(color.rgb,mix(ambient,color.rgb,alpha),blend_ambient);
return color.rgb; return color.rgb;
} }

View File

@ -165,7 +165,7 @@ Error ContextGL_Win::initialize() {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,//we want a 3.3 context WGL_CONTEXT_MAJOR_VERSION_ARB, 3,//we want a 3.3 context
WGL_CONTEXT_MINOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 3,
//and it shall be forward compatible so that we can only use up to date functionality //and it shall be forward compatible so that we can only use up to date functionality
WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB/*|WGL_CONTEXT_DEBUG_BIT_ARB*/,
0}; //zero indicates the end of the array 0}; //zero indicates the end of the array
PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL; //pointer to the method PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL; //pointer to the method

View File

@ -775,8 +775,10 @@ Ref<TriangleMesh> Mesh::generate_triangle_mesh() const {
DVector<int> indices = a[ARRAY_INDEX]; DVector<int> indices = a[ARRAY_INDEX];
DVector<int>::Read ir = indices.read(); DVector<int>::Read ir = indices.read();
for(int i=0;i<ic;i++) for(int i=0;i<ic;i++) {
facesw[widx++]=vr[ ir[i] ]; int index = ir[i];
facesw[widx++]=vr[ index ];
}
} else { } else {

View File

@ -2699,7 +2699,7 @@ void VisualServerScene::_bake_gi_probe_light(const GIProbeDataHeader *header,con
continue; // too far away continue; // too far away
float dt = CLAMP((d+distance_adv)/local_radius,0,1); float dt = CLAMP((d+distance_adv)/local_radius,0,1);
att*= pow(1.0-dt,light_cache.attenuation); att*= powf(1.0-dt,light_cache.attenuation);
} }
@ -2710,7 +2710,7 @@ void VisualServerScene::_bake_gi_probe_light(const GIProbeDataHeader *header,con
continue; continue;
float d = CLAMP(angle/light_cache.spot_angle,1,0); float d = CLAMP(angle/light_cache.spot_angle,1,0);
att*= pow(1.0-d,light_cache.spot_attenuation); att*= powf(1.0-d,light_cache.spot_attenuation);
} }

View File

@ -437,9 +437,9 @@ Error VisualServer::_surface_set_data(Array p_arrays,uint32_t p_format,uint32_t
for (int i=0;i<p_vertex_array_len;i++) { for (int i=0;i<p_vertex_array_len;i++) {
uint16_t vector[3]={ Math::make_half_float(src[i].x), Math::make_half_float(src[i].y), Math::make_half_float(src[i].z) }; uint16_t vector[4]={ Math::make_half_float(src[i].x), Math::make_half_float(src[i].y), Math::make_half_float(src[i].z), Math::make_half_float(1.0) };
copymem(&vw[p_offsets[ai]+i*p_stride], vector, sizeof(uint16_t)*3); copymem(&vw[p_offsets[ai]+i*p_stride], vector, sizeof(uint16_t)*4);
if (i==0) { if (i==0) {
@ -952,6 +952,11 @@ void VisualServer::mesh_add_surface_from_arrays(RID p_mesh,PrimitiveType p_primi
elem_size*=sizeof(float); elem_size*=sizeof(float);
} }
if (elem_size==6) {
//had to pad
elem_size=8;
}
} break; } break;
case VS::ARRAY_NORMAL: { case VS::ARRAY_NORMAL: {
@ -1138,6 +1143,10 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format,DVector<uint8_t> p
elem_size*=sizeof(float); elem_size*=sizeof(float);
} }
if (elem_size==6) {
elem_size=8;
}
} break; } break;
case VS::ARRAY_NORMAL: { case VS::ARRAY_NORMAL: {
@ -1207,7 +1216,7 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format,DVector<uint8_t> p
break; break;
} }
/* determine wether using 16 or 32 bits indices */ /* determine wether using 16 or 32 bits indices */
if (p_index_len>=(1<<16)) { if (p_vertex_len>=(1<<16)) {
elem_size=4; elem_size=4;
@ -1505,7 +1514,7 @@ Array VisualServer::_get_array_from_surface(uint32_t p_format,DVector<uint8_t> p
DVector<int> arr; DVector<int> arr;
arr.resize(p_index_len); arr.resize(p_index_len);
if (p_index_len<(1<<16)) { if (p_vertex_len<(1<<16)) {
DVector<int>::Write w = arr.write(); DVector<int>::Write w = arr.write();