diff options
Diffstat (limited to 'drivers/gles3')
| -rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.cpp | 69 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_storage_gles3.cpp | 57 | ||||
| -rw-r--r-- | drivers/gles3/shader_compiler_gles3.cpp | 64 | ||||
| -rw-r--r-- | drivers/gles3/shaders/canvas.glsl | 2 | ||||
| -rw-r--r-- | drivers/gles3/shaders/copy.glsl | 4 |
5 files changed, 150 insertions, 46 deletions
diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index da6df7198d..7c053e8f60 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -4234,17 +4234,14 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const clear_color = env->bg_color.to_linear(); storage->frame.clear_request = false; - } else if (env->bg_mode == VS::ENV_BG_SKY || env->bg_mode == VS::ENV_BG_COLOR_SKY) { + } else if (env->bg_mode == VS::ENV_BG_SKY) { - sky = storage->sky_owner.getornull(env->sky); + storage->frame.clear_request = false; - if (sky) { - env_radiance_tex = sky->radiance; - } + } else if (env->bg_mode == VS::ENV_BG_COLOR_SKY) { + + clear_color = env->bg_color.to_linear(); storage->frame.clear_request = false; - if (env->bg_mode == VS::ENV_BG_COLOR_SKY) { - clear_color = env->bg_color.to_linear(); - } } else { storage->frame.clear_request = false; @@ -4254,34 +4251,48 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const glClearBufferfv(GL_COLOR, 0, clear_color.components); // specular } - if (env && env->bg_mode == VS::ENV_BG_CANVAS) { - //copy canvas to 3d buffer and convert it to linear + if (env) { + switch (env->bg_mode) { + case VS::ENV_BG_COLOR_SKY: + + case VS::ENV_BG_SKY: - glDisable(GL_BLEND); - glDepthMask(GL_FALSE); - glDisable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); + sky = storage->sky_owner.getornull(env->sky); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color); + if (sky) { + env_radiance_tex = sky->radiance; + } + break; + case VS::ENV_BG_CANVAS: + //copy canvas to 3d buffer and convert it to linear - storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, true); + glDisable(GL_BLEND); + glDepthMask(GL_FALSE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); - storage->shaders.copy.set_conditional(CopyShaderGLES3::SRGB_TO_LINEAR, true); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color); - storage->shaders.copy.bind(); + storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, true); - _copy_screen(true, true); + storage->shaders.copy.set_conditional(CopyShaderGLES3::SRGB_TO_LINEAR, true); - //turn off everything used - storage->shaders.copy.set_conditional(CopyShaderGLES3::SRGB_TO_LINEAR, false); - storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, false); + storage->shaders.copy.bind(); - //restore - glEnable(GL_BLEND); - glDepthMask(GL_TRUE); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); + _copy_screen(true, true); + + //turn off everything used + storage->shaders.copy.set_conditional(CopyShaderGLES3::SRGB_TO_LINEAR, false); + storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, false); + + //restore + glEnable(GL_BLEND); + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + break; + } } state.texscreen_copied = false; @@ -4916,7 +4927,6 @@ void RasterizerSceneGLES3::initialize() { const int ubo_light_size = 160; state.ubo_light_size = ubo_light_size; state.max_ubo_lights = MIN(RenderList::MAX_LIGHTS, max_ubo_size / ubo_light_size); - print_line("GLES3: max ubo light: " + itos(state.max_ubo_lights)); state.spot_array_tmp = (uint8_t *)memalloc(ubo_light_size * state.max_ubo_lights); state.omni_array_tmp = (uint8_t *)memalloc(ubo_light_size * state.max_ubo_lights); @@ -4942,7 +4952,6 @@ void RasterizerSceneGLES3::initialize() { state.scene_shader.add_custom_define("#define MAX_FORWARD_LIGHTS " + itos(state.max_forward_lights_per_object) + "\n"); state.max_ubo_reflections = MIN(RenderList::MAX_REFLECTIONS, max_ubo_size / sizeof(ReflectionProbeDataUBO)); - print_line("GLES3: max ubo reflections: " + itos(state.max_ubo_reflections) + ", ubo size: " + itos(sizeof(ReflectionProbeDataUBO))); state.reflection_array_tmp = (uint8_t *)memalloc(sizeof(ReflectionProbeDataUBO) * state.max_ubo_reflections); diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 3255726c1f..0fc095a868 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -876,11 +876,34 @@ Ref<Image> RasterizerStorageGLES3::texture_get_data(RID p_texture, VS::CubeMapSi } } + Image::Format img_format; + + //convert special case RGB10_A2 to RGBA8 because it's not a supported image format + if (texture->gl_internal_format_cache == GL_RGB10_A2) { + + img_format = Image::FORMAT_RGBA8; + + uint32_t *ptr = (uint32_t *)wb.ptr(); + uint32_t num_pixels = data_size / 4; + + for (int ofs = 0; ofs < num_pixels; ofs++) { + uint32_t px = ptr[ofs]; + uint32_t a = px >> 30 & 0xFF; + + ptr[ofs] = (px >> 2 & 0xFF) | + (px >> 12 & 0xFF) << 8 | + (px >> 22 & 0xFF) << 16 | + (a | a << 2 | a << 4 | a << 6) << 24; + } + } else { + img_format = texture->format; + } + wb = PoolVector<uint8_t>::Write(); data.resize(data_size); - Image *img = memnew(Image(texture->alloc_width, texture->alloc_height, texture->mipmaps > 1 ? true : false, texture->format, data)); + Image *img = memnew(Image(texture->alloc_width, texture->alloc_height, texture->mipmaps > 1 ? true : false, img_format, data)); return Ref<Image>(img); #else @@ -2184,10 +2207,15 @@ _FORCE_INLINE_ static void _fill_std140_variant_ubo_value(ShaderLanguage::DataTy Transform2D v = value; GLfloat *gui = (GLfloat *)data; + //in std140 members of mat2 are treated as vec4s gui[0] = v.elements[0][0]; gui[1] = v.elements[0][1]; - gui[2] = v.elements[1][0]; - gui[3] = v.elements[1][1]; + gui[2] = 0; + gui[3] = 0; + gui[4] = v.elements[1][0]; + gui[5] = v.elements[1][1]; + gui[6] = 0; + gui[7] = 0; } break; case ShaderLanguage::TYPE_MAT3: { @@ -2362,9 +2390,15 @@ _FORCE_INLINE_ static void _fill_std140_ubo_value(ShaderLanguage::DataType type, case ShaderLanguage::TYPE_MAT2: { GLfloat *gui = (GLfloat *)data; - for (int i = 0; i < 2; i++) { - gui[i] = value[i].real; - } + //in std140 members of mat2 are treated as vec4s + gui[0] = value[0].real; + gui[1] = value[1].real; + gui[2] = 0; + gui[3] = 0; + gui[4] = value[2].real; + gui[5] = value[3].real; + gui[6] = 0; + gui[7] = 0; } break; case ShaderLanguage::TYPE_MAT3: { @@ -2418,11 +2452,14 @@ _FORCE_INLINE_ static void _fill_std140_ubo_empty(ShaderLanguage::DataType type, case ShaderLanguage::TYPE_BVEC4: case ShaderLanguage::TYPE_IVEC4: case ShaderLanguage::TYPE_UVEC4: - case ShaderLanguage::TYPE_VEC4: - case ShaderLanguage::TYPE_MAT2: { + case ShaderLanguage::TYPE_VEC4: { zeromem(data, 16); } break; + case ShaderLanguage::TYPE_MAT2: { + + zeromem(data, 32); + } break; case ShaderLanguage::TYPE_MAT3: { zeromem(data, 48); @@ -5332,7 +5369,7 @@ void RasterizerStorageGLES3::particles_set_emitting(RID p_particles, bool p_emit Particles *particles = particles_owner.getornull(p_particles); ERR_FAIL_COND(!particles); if (p_emitting != particles->emitting) { - // Restart is overriden by set_emitting + // Restart is overridden by set_emitting particles->restart_request = false; } particles->emitting = p_emitting; @@ -5680,6 +5717,7 @@ void RasterizerStorageGLES3::_particles_process(Particles *p_particles, float p_ SWAP(p_particles->particle_buffers[0], p_particles->particle_buffers[1]); SWAP(p_particles->particle_vaos[0], p_particles->particle_vaos[1]); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0); glBindVertexArray(0); /* //debug particles :D glBindBuffer(GL_ARRAY_BUFFER, p_particles->particle_buffers[0]); @@ -6950,6 +6988,7 @@ bool RasterizerStorageGLES3::free(RID p_rid) { memdelete(cls); } else if (particles_owner.owns(p_rid)) { Particles *particles = particles_owner.get(p_rid); + particles->instance_remove_deps(); particles_owner.free(p_rid); memdelete(particles); } else { diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp index ada7acb879..f1d7085d54 100644 --- a/drivers/gles3/shader_compiler_gles3.cpp +++ b/drivers/gles3/shader_compiler_gles3.cpp @@ -56,6 +56,41 @@ static int _get_datatype_size(SL::DataType p_type) { case SL::TYPE_VOID: return 0; case SL::TYPE_BOOL: return 4; case SL::TYPE_BVEC2: return 8; + case SL::TYPE_BVEC3: return 12; + case SL::TYPE_BVEC4: return 16; + case SL::TYPE_INT: return 4; + case SL::TYPE_IVEC2: return 8; + case SL::TYPE_IVEC3: return 12; + case SL::TYPE_IVEC4: return 16; + case SL::TYPE_UINT: return 4; + case SL::TYPE_UVEC2: return 8; + case SL::TYPE_UVEC3: return 12; + case SL::TYPE_UVEC4: return 16; + case SL::TYPE_FLOAT: return 4; + case SL::TYPE_VEC2: return 8; + case SL::TYPE_VEC3: return 12; + case SL::TYPE_VEC4: return 16; + case SL::TYPE_MAT2: + return 32; //4 * 4 + 4 * 4 + case SL::TYPE_MAT3: + return 48; // 4 * 4 + 4 * 4 + 4 * 4 + case SL::TYPE_MAT4: return 64; + case SL::TYPE_SAMPLER2D: return 16; + case SL::TYPE_ISAMPLER2D: return 16; + case SL::TYPE_USAMPLER2D: return 16; + case SL::TYPE_SAMPLERCUBE: return 16; + } + + ERR_FAIL_V(0); +} + +static int _get_datatype_alignment(SL::DataType p_type) { + + switch (p_type) { + + case SL::TYPE_VOID: return 0; + case SL::TYPE_BOOL: return 4; + case SL::TYPE_BVEC2: return 8; case SL::TYPE_BVEC3: return 16; case SL::TYPE_BVEC4: return 16; case SL::TYPE_INT: return 4; @@ -71,8 +106,8 @@ static int _get_datatype_size(SL::DataType p_type) { case SL::TYPE_VEC3: return 16; case SL::TYPE_VEC4: return 16; case SL::TYPE_MAT2: return 16; - case SL::TYPE_MAT3: return 48; - case SL::TYPE_MAT4: return 64; + case SL::TYPE_MAT3: return 16; + case SL::TYPE_MAT4: return 16; case SL::TYPE_SAMPLER2D: return 16; case SL::TYPE_ISAMPLER2D: return 16; case SL::TYPE_USAMPLER2D: return 16; @@ -81,7 +116,6 @@ static int _get_datatype_size(SL::DataType p_type) { ERR_FAIL_V(0); } - static String _interpstr(SL::DataInterpolation p_interp) { switch (p_interp) { @@ -341,7 +375,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener } uniform_defines[E->get().order] = ucode; uniform_sizes[E->get().order] = _get_datatype_size(E->get().type); - uniform_alignments[E->get().order] = MIN(16, _get_datatype_size(E->get().type)); + uniform_alignments[E->get().order] = _get_datatype_alignment(E->get().type); } p_actions.uniforms->insert(E->key(), E->get()); @@ -350,6 +384,27 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener for (int i = 0; i < max_uniforms; i++) { r_gen_code.uniforms += uniform_defines[i]; } +#if 1 + // add up + int offset = 0; + for (int i = 0; i < uniform_sizes.size(); i++) { + + int align = offset % uniform_alignments[i]; + + if (align != 0) { + offset += uniform_alignments[i] - align; + } + + r_gen_code.uniform_offsets.push_back(offset); + + offset += uniform_sizes[i]; + } + + r_gen_code.uniform_total_size = offset; + if (r_gen_code.uniform_total_size % 16 != 0) { //UBO sizes must be multiples of 16 + r_gen_code.uniform_total_size += r_gen_code.uniform_total_size % 16; + } +#else // add up for (int i = 0; i < uniform_sizes.size(); i++) { @@ -389,6 +444,7 @@ String ShaderCompilerGLES3::_dump_node_code(SL::Node *p_node, int p_level, Gener } else { r_gen_code.uniform_total_size = 0; } +#endif for (Map<StringName, SL::ShaderNode::Varying>::Element *E = pnode->varyings.front(); E; E = E->next()) { diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl index 46641482ec..f436ef06f7 100644 --- a/drivers/gles3/shaders/canvas.glsl +++ b/drivers/gles3/shaders/canvas.glsl @@ -285,7 +285,7 @@ MATERIAL_UNIFORMS FRAGMENT_SHADER_GLOBALS -void light_compute(inout vec3 light,vec3 light_vec,float light_height,vec4 light_color,vec2 light_uv,vec4 shadow,vec3 normal,vec2 uv,vec2 screen_uv,vec4 color) { +void light_compute(inout vec4 light,vec2 light_vec,float light_height,vec4 light_color,vec2 light_uv,vec4 shadow,vec3 normal,vec2 uv,vec2 screen_uv,vec4 color) { #if defined(USE_LIGHT_SHADER_CODE) diff --git a/drivers/gles3/shaders/copy.glsl b/drivers/gles3/shaders/copy.glsl index 743fe122d1..1b7c626d3c 100644 --- a/drivers/gles3/shaders/copy.glsl +++ b/drivers/gles3/shaders/copy.glsl @@ -131,7 +131,7 @@ void main() { #elif defined(USE_ASYM_PANO) - // When an assymetrical projection matrix is used (applicable for stereoscopic rendering i.e. VR) we need to do this calculation per fragment to get a perspective correct result. + // When an asymmetrical projection matrix is used (applicable for stereoscopic rendering i.e. VR) we need to do this calculation per fragment to get a perspective correct result. // Note that we're ignoring the x-offset for IPD, with Z sufficiently in the distance it becomes neglectible, as a result we could probably just set cube_normal.z to -1. // The Matrix[2][0] (= asym_proj.x) and Matrix[2][1] (= asym_proj.z) values are what provide the right shift in the image. @@ -161,7 +161,7 @@ void main() { #ifdef SRGB_TO_LINEAR - color.rgb = mix(pow((color.rgb + vec3(0.055)) * (1.0 / (1 + 0.055)),vec3(2.4)),color.rgb * (1.0 / 12.92),lessThan(color.rgb,vec3(0.04045))); + color.rgb = mix(pow((color.rgb + vec3(0.055)) * (1.0 / (1.0 + 0.055)),vec3(2.4)),color.rgb * (1.0 / 12.92),lessThan(color.rgb,vec3(0.04045))); #endif #ifdef DEBUG_GRADIENT |