diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/alsa/audio_driver_alsa.cpp | 80 | ||||
| -rw-r--r-- | drivers/coreaudio/audio_driver_coreaudio.cpp | 7 | ||||
| -rw-r--r-- | drivers/dummy/rasterizer_dummy.h | 1 | ||||
| -rw-r--r-- | drivers/gles2/rasterizer_canvas_gles2.cpp | 8 | ||||
| -rw-r--r-- | drivers/gles2/rasterizer_gles2.cpp | 2 | ||||
| -rw-r--r-- | drivers/gles2/rasterizer_storage_gles2.cpp | 12 | ||||
| -rw-r--r-- | drivers/gles2/rasterizer_storage_gles2.h | 8 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_canvas_gles3.cpp | 16 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.cpp | 12 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_storage_gles3.cpp | 9 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_storage_gles3.h | 3 | ||||
| -rw-r--r-- | drivers/gles3/shader_compiler_gles3.cpp | 1 | ||||
| -rw-r--r-- | drivers/gles3/shaders/scene.glsl | 56 | ||||
| -rw-r--r-- | drivers/pulseaudio/audio_driver_pulseaudio.cpp | 20 | ||||
| -rw-r--r-- | drivers/rtaudio/audio_driver_rtaudio.cpp | 4 | ||||
| -rw-r--r-- | drivers/wasapi/audio_driver_wasapi.cpp | 68 | ||||
| -rw-r--r-- | drivers/wasapi/audio_driver_wasapi.h | 1 | ||||
| -rw-r--r-- | drivers/windows/file_access_windows.cpp | 6 | ||||
| -rw-r--r-- | drivers/xaudio2/audio_driver_xaudio2.cpp | 2 | 
19 files changed, 182 insertions, 134 deletions
diff --git a/drivers/alsa/audio_driver_alsa.cpp b/drivers/alsa/audio_driver_alsa.cpp index 1e17e72532..ae85ee50d1 100644 --- a/drivers/alsa/audio_driver_alsa.cpp +++ b/drivers/alsa/audio_driver_alsa.cpp @@ -142,8 +142,6 @@ Error AudioDriverALSA::init_device() {  	samples_in.resize(period_size * channels);  	samples_out.resize(period_size * channels); -	snd_pcm_nonblock(pcm_handle, 0); -  	return OK;  } @@ -168,54 +166,50 @@ void AudioDriverALSA::thread_func(void *p_udata) {  	AudioDriverALSA *ad = (AudioDriverALSA *)p_udata;  	while (!ad->exit_thread) { + +		ad->lock(); +		ad->start_counting_ticks(); +  		if (!ad->active) {  			for (unsigned int i = 0; i < ad->period_size * ad->channels; i++) {  				ad->samples_out[i] = 0; -			}; -		} else { -			ad->lock(); +			} +		} else {  			ad->audio_server_process(ad->period_size, ad->samples_in.ptrw()); -			ad->unlock(); -  			for (unsigned int i = 0; i < ad->period_size * ad->channels; i++) {  				ad->samples_out[i] = ad->samples_in[i] >> 16;  			} -		}; +		}  		int todo = ad->period_size;  		int total = 0; -		while (todo) { -			if (ad->exit_thread) -				break; +		while (todo && !ad->exit_thread) {  			uint8_t *src = (uint8_t *)ad->samples_out.ptr();  			int wrote = snd_pcm_writei(ad->pcm_handle, (void *)(src + (total * ad->channels)), todo); -			if (wrote < 0) { -				if (ad->exit_thread) -					break; +			if (wrote > 0) { +				total += wrote; +				todo -= wrote; +			} else if (wrote == -EAGAIN) { +				ad->stop_counting_ticks(); +				ad->unlock(); -				if (wrote == -EAGAIN) { -					//can't write yet (though this is blocking..) -					usleep(1000); -					continue; -				} +				OS::get_singleton()->delay_usec(1000); + +				ad->lock(); +				ad->start_counting_ticks(); +			} else {  				wrote = snd_pcm_recover(ad->pcm_handle, wrote, 0);  				if (wrote < 0) { -					//absolute fail -					fprintf(stderr, "ALSA failed and can't recover: %s\n", snd_strerror(wrote)); +					ERR_PRINTS("ALSA: Failed and can't recover: " + String(snd_strerror(wrote)));  					ad->active = false;  					ad->exit_thread = true; -					break;  				} -				continue; -			}; - -			total += wrote; -			todo -= wrote; -		}; +			} +		}  		// User selected a new device, finish the current one so we'll init the new device  		if (ad->device_name != ad->new_device) { @@ -232,10 +226,12 @@ void AudioDriverALSA::thread_func(void *p_udata) {  				if (err != OK) {  					ad->active = false;  					ad->exit_thread = true; -					break;  				}  			}  		} + +		ad->stop_counting_ticks(); +		ad->unlock();  	};  	ad->thread_exited = true; @@ -296,7 +292,9 @@ String AudioDriverALSA::get_device() {  void AudioDriverALSA::set_device(String device) { +	lock();  	new_device = device; +	unlock();  }  void AudioDriverALSA::lock() { @@ -323,21 +321,21 @@ void AudioDriverALSA::finish_device() {  void AudioDriverALSA::finish() { -	if (!thread) -		return; - -	exit_thread = true; -	Thread::wait_to_finish(thread); +	if (thread) { +		exit_thread = true; +		Thread::wait_to_finish(thread); -	finish_device(); +		memdelete(thread); +		thread = NULL; -	memdelete(thread); -	if (mutex) { -		memdelete(mutex); -		mutex = NULL; +		if (mutex) { +			memdelete(mutex); +			mutex = NULL; +		}  	} -	thread = NULL; -}; + +	finish_device(); +}  AudioDriverALSA::AudioDriverALSA() { diff --git a/drivers/coreaudio/audio_driver_coreaudio.cpp b/drivers/coreaudio/audio_driver_coreaudio.cpp index ef7858b4ca..ac21de91e4 100644 --- a/drivers/coreaudio/audio_driver_coreaudio.cpp +++ b/drivers/coreaudio/audio_driver_coreaudio.cpp @@ -102,7 +102,7 @@ Error AudioDriverCoreAudio::init() {  			break;  	} -	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE); +	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);  	zeromem(&strdesc, sizeof(strdesc));  	strdesc.mFormatID = kAudioFormatLinearPCM; @@ -117,7 +117,7 @@ Error AudioDriverCoreAudio::init() {  	result = AudioUnitSetProperty(audio_unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &strdesc, sizeof(strdesc));  	ERR_FAIL_COND_V(result != noErr, FAILED); -	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY); +	int latency = GLOBAL_DEF_RST("audio/output_latency", DEFAULT_OUTPUT_LATENCY);  	// Sample rate is independent of channels (ref: https://stackoverflow.com/questions/11048825/audio-sample-frequency-rely-on-channels)  	buffer_frames = closest_power_of_2(latency * mix_rate / 1000); @@ -163,6 +163,8 @@ OSStatus AudioDriverCoreAudio::output_callback(void *inRefCon,  		return 0;  	}; +	ad->start_counting_ticks(); +  	for (unsigned int i = 0; i < ioData->mNumberBuffers; i++) {  		AudioBuffer *abuf = &ioData->mBuffers[i]; @@ -184,6 +186,7 @@ OSStatus AudioDriverCoreAudio::output_callback(void *inRefCon,  		};  	}; +	ad->stop_counting_ticks();  	ad->unlock();  	return 0; diff --git a/drivers/dummy/rasterizer_dummy.h b/drivers/dummy/rasterizer_dummy.h index 068a14cb8a..bab89f649a 100644 --- a/drivers/dummy/rasterizer_dummy.h +++ b/drivers/dummy/rasterizer_dummy.h @@ -235,6 +235,7 @@ public:  	void textures_keep_original(bool p_enable) {}  	void texture_set_proxy(RID p_proxy, RID p_base) {} +	void texture_set_force_redraw_if_visible(RID p_texture, bool p_enable) {}  	/* SKY API */ diff --git a/drivers/gles2/rasterizer_canvas_gles2.cpp b/drivers/gles2/rasterizer_canvas_gles2.cpp index d5232a6511..daa421d45c 100644 --- a/drivers/gles2/rasterizer_canvas_gles2.cpp +++ b/drivers/gles2/rasterizer_canvas_gles2.cpp @@ -140,6 +140,10 @@ RasterizerStorageGLES2::Texture *RasterizerCanvasGLES2::_bind_canvas_texture(con  			texture = texture->get_ptr(); +			if (texture->redraw_if_visible) { +				VisualServerRaster::redraw_request(); +			} +  			if (texture->render_target) {  				texture->render_target->used_in_frame = true;  			} @@ -909,6 +913,10 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons  					t = t->get_ptr(); +					if (t->redraw_if_visible) { +						VisualServerRaster::redraw_request(); +					} +  					glBindTexture(t->target, t->tex_id);  				}  			} else { diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index ab48e682d6..9ea20ff15a 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -203,7 +203,7 @@ void RasterizerGLES2::initialize() {  #endif // GLAD_ENABLED -		// For debugging +	// For debugging  #ifdef GLES_OVER_GL  	if (GLAD_GL_ARB_debug_output) {  		glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_ERROR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, NULL, GL_TRUE); diff --git a/drivers/gles2/rasterizer_storage_gles2.cpp b/drivers/gles2/rasterizer_storage_gles2.cpp index ca39531b0d..2da496d4b7 100644 --- a/drivers/gles2/rasterizer_storage_gles2.cpp +++ b/drivers/gles2/rasterizer_storage_gles2.cpp @@ -674,6 +674,14 @@ void RasterizerStorageGLES2::texture_set_proxy(RID p_texture, RID p_proxy) {  	}  } +void RasterizerStorageGLES2::texture_set_force_redraw_if_visible(RID p_texture, bool p_enable) { + +	Texture *texture = texture_owner.getornull(p_texture); +	ERR_FAIL_COND(!texture); + +	texture->redraw_if_visible = p_enable; +} +  void RasterizerStorageGLES2::texture_set_detect_3d_callback(RID p_texture, VisualServer::TextureDetectCallback p_callback, void *p_userdata) {  	// TODO  } @@ -1182,7 +1190,7 @@ RID RasterizerStorageGLES2::multimesh_create() {  	return RID();  } -void RasterizerStorageGLES2::multimesh_allocate(RID p_multimesh, int p_instances, VS::MultimeshTransformFormat p_transform_format, VS::MultimeshColorFormat p_color_format,VS::MultimeshCustomDataFormat p_data) { +void RasterizerStorageGLES2::multimesh_allocate(RID p_multimesh, int p_instances, VS::MultimeshTransformFormat p_transform_format, VS::MultimeshColorFormat p_color_format, VS::MultimeshCustomDataFormat p_data) {  }  int RasterizerStorageGLES2::multimesh_get_instance_count(RID p_multimesh) const { @@ -1225,8 +1233,6 @@ Color RasterizerStorageGLES2::multimesh_instance_get_custom_data(RID p_multimesh  }  void RasterizerStorageGLES2::multimesh_set_as_bulk_array(RID p_multimesh, const PoolVector<float> &p_array) { - -  }  void RasterizerStorageGLES2::multimesh_set_visible_instances(RID p_multimesh, int p_visible) { diff --git a/drivers/gles2/rasterizer_storage_gles2.h b/drivers/gles2/rasterizer_storage_gles2.h index df8c2fcf47..30e13a9f65 100644 --- a/drivers/gles2/rasterizer_storage_gles2.h +++ b/drivers/gles2/rasterizer_storage_gles2.h @@ -182,6 +182,8 @@ public:  		Ref<Image> images[6]; +		bool redraw_if_visible; +  		Texture() {  			flags = 0;  			width = 0; @@ -205,6 +207,8 @@ public:  			proxy = NULL;  			render_target = NULL; + +			redraw_if_visible = false;  		}  		_ALWAYS_INLINE_ Texture *get_ptr() { @@ -264,6 +268,8 @@ public:  	virtual void texture_set_detect_srgb_callback(RID p_texture, VisualServer::TextureDetectCallback p_callback, void *p_userdata);  	virtual void texture_set_detect_normal_callback(RID p_texture, VisualServer::TextureDetectCallback p_callback, void *p_userdata); +	virtual void texture_set_force_redraw_if_visible(RID p_texture, bool p_enable); +  	/* SKY API */  	virtual RID sky_create(); @@ -508,7 +514,7 @@ public:  	virtual RID multimesh_create(); -	virtual void multimesh_allocate(RID p_multimesh, int p_instances, VS::MultimeshTransformFormat p_transform_format, VS::MultimeshColorFormat p_color_format,VS::MultimeshCustomDataFormat p_data=VS::MULTIMESH_CUSTOM_DATA_NONE); +	virtual void multimesh_allocate(RID p_multimesh, int p_instances, VS::MultimeshTransformFormat p_transform_format, VS::MultimeshColorFormat p_color_format, VS::MultimeshCustomDataFormat p_data = VS::MULTIMESH_CUSTOM_DATA_NONE);  	virtual int multimesh_get_instance_count(RID p_multimesh) const;  	virtual void multimesh_set_mesh(RID p_multimesh, RID p_mesh); diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index f214943bcf..5e13bed198 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -211,6 +211,10 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con  		} else { +			if (texture->redraw_if_visible) { //check before proxy, because this is usually used with proxies +				VisualServerRaster::redraw_request(); +			} +  			texture = texture->get_ptr();  			if (texture->render_target) @@ -248,6 +252,10 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con  		} else { +			if (normal_map->redraw_if_visible) { //check before proxy, because this is usually used with proxies +				VisualServerRaster::redraw_request(); +			} +  			normal_map = normal_map->get_ptr();  			glActiveTexture(GL_TEXTURE1);  			glBindTexture(GL_TEXTURE_2D, normal_map->tex_id); @@ -1266,6 +1274,10 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons  						continue;  					} +					if (t->redraw_if_visible) { //check before proxy, because this is usually used with proxies +						VisualServerRaster::redraw_request(); +					} +  					t = t->get_ptr();  					if (storage->config.srgb_decode_supported && t->using_srgb) { @@ -1883,7 +1895,7 @@ void RasterizerCanvasGLES3::initialize() {  	}  	{ -		uint32_t poly_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128); +		uint32_t poly_size = GLOBAL_DEF_RST("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128);  		poly_size *= 1024; //kb  		poly_size = MAX(poly_size, (2 + 2 + 4) * 4 * sizeof(float));  		glGenBuffers(1, &data.polygon_buffer); @@ -1930,7 +1942,7 @@ void RasterizerCanvasGLES3::initialize() {  		glGenVertexArrays(1, &data.polygon_buffer_pointer_array); -		uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128); +		uint32_t index_size = GLOBAL_DEF_RST("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128);  		index_size *= 1024; //kb  		glGenBuffers(1, &data.polygon_index_buffer);  		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer); diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 7c2af755cd..85b63a6481 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1225,7 +1225,12 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m  		} else { +			if (t->redraw_if_visible) { //must check before proxy because this is often used with proxies +				VisualServerRaster::redraw_request(); +			} +  			t = t->get_ptr(); //resolve for proxies +  #ifdef TOOLS_ENABLED  			if (t->detect_3d) {  				t->detect_3d(t->detect_3d_ud); @@ -1569,6 +1574,11 @@ void RasterizerSceneGLES3::_render_geometry(RenderList::Element *e) {  					RasterizerStorageGLES3::Texture *t = storage->texture_owner.get(c.texture);  					t = t->get_ptr(); //resolve for proxies + +					if (t->redraw_if_visible) { +						VisualServerRaster::redraw_request(); +					} +  #ifdef TOOLS_ENABLED  					if (t->detect_3d) {  						t->detect_3d(t->detect_3d_ud); @@ -4856,7 +4866,7 @@ void RasterizerSceneGLES3::initialize() {  	glBufferData(GL_UNIFORM_BUFFER, sizeof(State::EnvironmentRadianceUBO), &state.env_radiance_ubo, GL_DYNAMIC_DRAW);  	glBindBuffer(GL_UNIFORM_BUFFER, 0); -	render_list.max_elements = GLOBAL_DEF("rendering/limits/rendering/max_renderable_elements", (int)RenderList::DEFAULT_MAX_ELEMENTS); +	render_list.max_elements = GLOBAL_DEF_RST("rendering/limits/rendering/max_renderable_elements", (int)RenderList::DEFAULT_MAX_ELEMENTS);  	if (render_list.max_elements > 1000000)  		render_list.max_elements = 1000000;  	if (render_list.max_elements < 1024) diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 4a3ebf7a7c..e67b0bea21 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -1328,6 +1328,13 @@ void RasterizerStorageGLES3::texture_set_proxy(RID p_texture, RID p_proxy) {  	}  } +void RasterizerStorageGLES3::texture_set_force_redraw_if_visible(RID p_texture, bool p_enable) { + +	Texture *texture = texture_owner.get(p_texture); +	ERR_FAIL_COND(!texture); +	texture->redraw_if_visible = p_enable; +} +  RID RasterizerStorageGLES3::sky_create() {  	Sky *sky = memnew(Sky); @@ -7456,7 +7463,7 @@ void RasterizerStorageGLES3::initialize() {  	{  		//transform feedback buffers -		uint32_t xf_feedback_size = GLOBAL_DEF("rendering/limits/buffers/blend_shape_max_buffer_size_kb", 4096); +		uint32_t xf_feedback_size = GLOBAL_DEF_RST("rendering/limits/buffers/blend_shape_max_buffer_size_kb", 4096);  		for (int i = 0; i < 2; i++) {  			glGenBuffers(1, &resources.transform_feedback_buffers[i]); diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h index 7a2d56f69b..80df21941b 100644 --- a/drivers/gles3/rasterizer_storage_gles3.h +++ b/drivers/gles3/rasterizer_storage_gles3.h @@ -268,6 +268,7 @@ public:  		GLuint tex_id;  		bool using_srgb; +		bool redraw_if_visible;  		uint16_t stored_cube_sides; @@ -306,6 +307,7 @@ public:  			detect_normal = NULL;  			detect_normal_ud = NULL;  			proxy = NULL; +			redraw_if_visible = false;  		}  		_ALWAYS_INLINE_ Texture *get_ptr() { @@ -366,6 +368,7 @@ public:  	virtual void texture_set_detect_normal_callback(RID p_texture, VisualServer::TextureDetectCallback p_callback, void *p_userdata);  	virtual void texture_set_proxy(RID p_texture, RID p_proxy); +	virtual void texture_set_force_redraw_if_visible(RID p_texture, bool p_enable);  	/* SKY API */ diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp index 9ad16ac2a2..3f6fe3ec61 100644 --- a/drivers/gles3/shader_compiler_gles3.cpp +++ b/drivers/gles3/shader_compiler_gles3.cpp @@ -913,6 +913,7 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() {  	actions[VS::SHADER_SPATIAL].render_mode_defines["specular_toon"] = "#define SPECULAR_TOON\n";  	actions[VS::SHADER_SPATIAL].render_mode_defines["specular_disabled"] = "#define SPECULAR_DISABLED\n";  	actions[VS::SHADER_SPATIAL].render_mode_defines["shadows_disabled"] = "#define SHADOWS_DISABLED\n"; +	actions[VS::SHADER_SPATIAL].render_mode_defines["ambient_light_disabled"] = "#define AMBIENT_LIGHT_DISABLED\n";  	/* PARTICLES SHADER */ diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index ed8df04377..abb236138f 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -571,11 +571,6 @@ in vec3 normal_interp;  /* PBR CHANNELS */ -//used on forward mainly -uniform bool no_ambient_light; - - -  #ifdef USE_RADIANCE_MAP @@ -1752,42 +1747,43 @@ FRAGMENT_SHADER_CODE  #ifdef USE_RADIANCE_MAP -	if (no_ambient_light) { -		ambient_light=vec3(0.0,0.0,0.0); -	} else { -		{ - -			{ //read radiance from dual paraboloid +#ifdef AMBIENT_LIGHT_DISABLED +	ambient_light=vec3(0.0,0.0,0.0); +#else +	{ -				vec3 ref_vec = reflect(-eye_vec,normal); //2.0 * ndotv * normal - view; // reflect(v, n); -				ref_vec=normalize((radiance_inverse_xform * vec4(ref_vec,0.0)).xyz); -				vec3 radiance = textureDualParaboloid(radiance_map,ref_vec,roughness) * bg_energy; -				env_reflection_light = radiance; +		{ //read radiance from dual paraboloid -			} -			//no longer a cubemap -			//vec3 radiance = textureLod(radiance_cube, r, lod).xyz * ( brdf.x + brdf.y); +			vec3 ref_vec = reflect(-eye_vec,normal); //2.0 * ndotv * normal - view; // reflect(v, n); +			ref_vec=normalize((radiance_inverse_xform * vec4(ref_vec,0.0)).xyz); +			vec3 radiance = textureDualParaboloid(radiance_map,ref_vec,roughness) * bg_energy; +			env_reflection_light = radiance;  		} +		//no longer a cubemap +		//vec3 radiance = textureLod(radiance_cube, r, lod).xyz * ( brdf.x + brdf.y); + +	}  #ifndef USE_LIGHTMAP -		{ +	{ -			vec3 ambient_dir=normalize((radiance_inverse_xform * vec4(normal,0.0)).xyz); -			vec3 env_ambient=textureDualParaboloid(radiance_map,ambient_dir,1.0) * bg_energy; +		vec3 ambient_dir=normalize((radiance_inverse_xform * vec4(normal,0.0)).xyz); +		vec3 env_ambient=textureDualParaboloid(radiance_map,ambient_dir,1.0) * bg_energy; -			ambient_light=mix(ambient_light_color.rgb,env_ambient,radiance_ambient_contribution); -			//ambient_light=vec3(0.0,0.0,0.0); -		} -#endif +		ambient_light=mix(ambient_light_color.rgb,env_ambient,radiance_ambient_contribution); +		//ambient_light=vec3(0.0,0.0,0.0);  	} +#endif +#endif //AMBIENT_LIGHT_DISABLED  #else -	if (no_ambient_light){ -		ambient_light=vec3(0.0,0.0,0.0); -	} else { -		ambient_light=ambient_light_color.rgb; -	} +#ifdef AMBIENT_LIGHT_DISABLED +	ambient_light=vec3(0.0,0.0,0.0); +#else +	ambient_light=ambient_light_color.rgb; +#endif //AMBIENT_LIGHT_DISABLED +  #endif  	ambient_light*=ambient_energy; diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.cpp b/drivers/pulseaudio/audio_driver_pulseaudio.cpp index 0f47949b4b..3622e48ecd 100644 --- a/drivers/pulseaudio/audio_driver_pulseaudio.cpp +++ b/drivers/pulseaudio/audio_driver_pulseaudio.cpp @@ -155,7 +155,7 @@ Error AudioDriverPulseAudio::init_device() {  			break;  	} -	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY); +	int latency = GLOBAL_DEF_RST("audio/output_latency", DEFAULT_OUTPUT_LATENCY);  	buffer_frames = closest_power_of_2(latency * mix_rate / 1000);  	pa_buffer_size = buffer_frames * pa_map.channels; @@ -204,7 +204,7 @@ Error AudioDriverPulseAudio::init() {  	thread_exited = false;  	exit_thread = false; -	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE); +	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);  	pa_ml = pa_mainloop_new();  	ERR_FAIL_COND_V(pa_ml == NULL, ERR_CANT_OPEN); @@ -289,18 +289,18 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {  	AudioDriverPulseAudio *ad = (AudioDriverPulseAudio *)p_udata;  	while (!ad->exit_thread) { + +		ad->lock(); +		ad->start_counting_ticks(); +  		if (!ad->active) {  			for (unsigned int i = 0; i < ad->pa_buffer_size; i++) {  				ad->samples_out[i] = 0;  			}  		} else { -			ad->lock(); -  			ad->audio_server_process(ad->buffer_frames, ad->samples_in.ptrw()); -			ad->unlock(); -  			if (ad->channels == ad->pa_map.channels) {  				for (unsigned int i = 0; i < ad->pa_buffer_size; i++) {  					ad->samples_out[i] = ad->samples_in[i] >> 16; @@ -323,9 +323,6 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {  		int error_code;  		int byte_size = ad->pa_buffer_size * sizeof(int16_t); - -		ad->lock(); -  		int ret;  		do {  			ret = pa_mainloop_iterate(ad->pa_ml, 0, NULL); @@ -350,11 +347,13 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {  					if (ret == 0) {  						// If pa_mainloop_iterate returns 0 sleep for 1 msec to wait  						// for the stream to be able to process more bytes +						ad->stop_counting_ticks();  						ad->unlock();  						OS::get_singleton()->delay_usec(1000);  						ad->lock(); +						ad->start_counting_ticks();  					}  				}  			} @@ -380,6 +379,7 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {  			}  		} +		ad->stop_counting_ticks();  		ad->unlock();  	} @@ -453,7 +453,9 @@ String AudioDriverPulseAudio::get_device() {  void AudioDriverPulseAudio::set_device(String device) { +	lock();  	new_device = device; +	unlock();  }  void AudioDriverPulseAudio::lock() { diff --git a/drivers/rtaudio/audio_driver_rtaudio.cpp b/drivers/rtaudio/audio_driver_rtaudio.cpp index 457486797f..365788e192 100644 --- a/drivers/rtaudio/audio_driver_rtaudio.cpp +++ b/drivers/rtaudio/audio_driver_rtaudio.cpp @@ -88,7 +88,7 @@ Error AudioDriverRtAudio::init() {  	// FIXME: Adapt to the OutputFormat -> SpeakerMode change  	/* -	String channels = GLOBAL_DEF("audio/output","stereo"); +	String channels = GLOBAL_DEF_RST("audio/output","stereo");  	if (channels=="5.1")  		output_format=OUTPUT_5_1; @@ -108,7 +108,7 @@ Error AudioDriverRtAudio::init() {  	options.numberOfBuffers = 4;  	parameters.firstChannel = 0; -	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE); +	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);  	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY);  	unsigned int buffer_frames = closest_power_of_2(latency * mix_rate / 1000); diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index e1680601ad..1d96f9ee7d 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -318,7 +318,7 @@ Error AudioDriverWASAPI::finish_device() {  Error AudioDriverWASAPI::init() { -	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE); +	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);  	Error err = init_device();  	if (err != OK) { @@ -335,22 +335,6 @@ Error AudioDriverWASAPI::init() {  	return OK;  } -Error AudioDriverWASAPI::reopen() { -	Error err = finish_device(); -	if (err != OK) { -		ERR_PRINT("WASAPI: finish_device error"); -	} else { -		err = init_device(); -		if (err != OK) { -			ERR_PRINT("WASAPI: init_device error"); -		} else { -			start(); -		} -	} - -	return err; -} -  int AudioDriverWASAPI::get_mix_rate() const {  	return mix_rate; @@ -416,7 +400,9 @@ String AudioDriverWASAPI::get_device() {  void AudioDriverWASAPI::set_device(String device) { +	lock();  	new_device = device; +	unlock();  }  void AudioDriverWASAPI::write_sample(AudioDriverWASAPI *ad, BYTE *buffer, int i, int32_t sample) { @@ -453,24 +439,31 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {  	AudioDriverWASAPI *ad = (AudioDriverWASAPI *)p_udata;  	while (!ad->exit_thread) { -		if (ad->active) { -			ad->lock(); -			ad->audio_server_process(ad->buffer_frames, ad->samples_in.ptrw()); +		ad->lock(); +		ad->start_counting_ticks(); -			ad->unlock(); +		if (ad->active) { +			ad->audio_server_process(ad->buffer_frames, ad->samples_in.ptrw());  		} else {  			for (unsigned int i = 0; i < ad->buffer_size; i++) {  				ad->samples_in[i] = 0;  			}  		} +		ad->stop_counting_ticks(); +		ad->unlock(); +  		unsigned int left_frames = ad->buffer_frames;  		unsigned int buffer_idx = 0;  		while (left_frames > 0 && ad->audio_client) {  			WaitForSingleObject(ad->event, 1000); +			ad->lock(); +			ad->start_counting_ticks(); +  			UINT32 cur_frames; +			bool invalidated = false;  			HRESULT hr = ad->audio_client->GetCurrentPadding(&cur_frames);  			if (hr == S_OK) {  				// Check how much frames are available on the WASAPI buffer @@ -506,34 +499,34 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {  					left_frames -= write_frames;  				} else if (hr == AUDCLNT_E_DEVICE_INVALIDATED) { -					// Device is not valid anymore, reopen it - -					Error err = ad->finish_device(); -					if (err != OK) { -						ERR_PRINT("WASAPI: finish_device error"); -					} else { -						// We reopened the device and samples_in may have resized, so invalidate the current left_frames -						left_frames = 0; -					} +					invalidated = true;  				} else {  					ERR_PRINT("WASAPI: Get buffer error");  					ad->exit_thread = true;  				}  			} else if (hr == AUDCLNT_E_DEVICE_INVALIDATED) { -				// Device is not valid anymore, reopen it +				invalidated = true; +			} else { +				ERR_PRINT("WASAPI: GetCurrentPadding error"); +			} + +			if (invalidated) { +				// Device is not valid anymore +				WARN_PRINT("WASAPI: Current device invalidated, closing device");  				Error err = ad->finish_device();  				if (err != OK) {  					ERR_PRINT("WASAPI: finish_device error"); -				} else { -					// We reopened the device and samples_in may have resized, so invalidate the current left_frames -					left_frames = 0;  				} -			} else { -				ERR_PRINT("WASAPI: GetCurrentPadding error");  			} + +			ad->stop_counting_ticks(); +			ad->unlock();  		} +		ad->lock(); +		ad->start_counting_ticks(); +  		// If we're using the Default device and it changed finish it so we'll re-init the device  		if (ad->device_name == "Default" && default_device_changed) {  			Error err = ad->finish_device(); @@ -559,6 +552,9 @@ void AudioDriverWASAPI::thread_func(void *p_udata) {  				ad->start();  			}  		} + +		ad->stop_counting_ticks(); +		ad->unlock();  	}  	ad->thread_exited = true; diff --git a/drivers/wasapi/audio_driver_wasapi.h b/drivers/wasapi/audio_driver_wasapi.h index c97f4c288c..f3ee5976eb 100644 --- a/drivers/wasapi/audio_driver_wasapi.h +++ b/drivers/wasapi/audio_driver_wasapi.h @@ -72,7 +72,6 @@ class AudioDriverWASAPI : public AudioDriver {  	Error init_device(bool reinit = false);  	Error finish_device(); -	Error reopen();  public:  	virtual const char *get_name() const { diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp index aa0fd34e0a..ea194e5eae 100644 --- a/drivers/windows/file_access_windows.cpp +++ b/drivers/windows/file_access_windows.cpp @@ -141,9 +141,9 @@ void FileAccessWindows::close() {  		bool rename_error = true;  		int attempts = 4;  		while (rename_error && attempts) { -		// This workaround of trying multiple times is added to deal with paranoid Windows -		// antiviruses that love reading just written files even if they are not executable, thus -		// locking the file and preventing renaming from happening. +			// This workaround of trying multiple times is added to deal with paranoid Windows +			// antiviruses that love reading just written files even if they are not executable, thus +			// locking the file and preventing renaming from happening.  #ifdef UWP_ENABLED  			// UWP has no PathFileExists, so we check attributes instead diff --git a/drivers/xaudio2/audio_driver_xaudio2.cpp b/drivers/xaudio2/audio_driver_xaudio2.cpp index 6675459313..db108f9c6b 100644 --- a/drivers/xaudio2/audio_driver_xaudio2.cpp +++ b/drivers/xaudio2/audio_driver_xaudio2.cpp @@ -50,7 +50,7 @@ Error AudioDriverXAudio2::init() {  	speaker_mode = SPEAKER_MODE_STEREO;  	channels = 2; -	int latency = GLOBAL_DEF("audio/output_latency", 25); +	int latency = GLOBAL_DEF_RST("audio/output_latency", 25);  	buffer_size = closest_power_of_2(latency * mix_rate / 1000);  	samples_in = memnew_arr(int32_t, buffer_size * channels);  |