[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58930] trunk/blender/intern/cycles/kernel /osl: Cycles OSL: image texture lookup optimization, acquire the per thread handle

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Aug 5 14:49:15 CEST 2013


Revision: 58930
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58930
Author:   blendix
Date:     2013-08-05 12:49:15 +0000 (Mon, 05 Aug 2013)
Log Message:
-----------
Cycles OSL: image texture lookup optimization, acquire the per thread handle
for texture system in advance. Patch by Martijn Berger, with some tweaks.

There was about a 10% performance improvement on OS X in my tests with the
images.blend test file. This may be less on other platforms because OS X has
particularly slow mutex locks.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/osl/osl_globals.h
    trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp

Modified: trunk/blender/intern/cycles/kernel/osl/osl_globals.h
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_globals.h	2013-08-05 12:49:13 UTC (rev 58929)
+++ trunk/blender/intern/cycles/kernel/osl/osl_globals.h	2013-08-05 12:49:15 UTC (rev 58930)
@@ -87,9 +87,10 @@
 /* thread key for thread specific data lookup */
 struct OSLThreadData {
 	OSL::ShaderGlobals globals;
-	OSL::PerThreadInfo *thread_info;
+	OSL::PerThreadInfo *osl_thread_info;
 	OSLTraceData tracedata;
 	OSL::ShadingContext *context[SHADER_CONTEXT_NUM];
+	OIIO::TextureSystem::Perthread *oiio_thread_info;
 };
 
 CCL_NAMESPACE_END

Modified: trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_services.cpp	2013-08-05 12:49:13 UTC (rev 58929)
+++ trunk/blender/intern/cycles/kernel/osl/osl_services.cpp	2013-08-05 12:49:15 UTC (rev 58930)
@@ -775,8 +775,16 @@
                                 float dsdy, float dtdy, float *result)
 {
 	OSL::TextureSystem *ts = osl_ts;
-	bool status = ts->texture(filename, options, s, t, dsdx, dtdx, dsdy, dtdy, result);
+	ShaderData *sd = (ShaderData *)(sg->renderstate);
+	KernelGlobals *kg = sd->osl_globals;
+	OSLThreadData *tdata = kg->osl_tdata;
+	OIIO::TextureSystem::Perthread *thread_info = tdata->oiio_thread_info;
 
+	OIIO::TextureSystem::TextureHandle *th = ts->get_texture_handle(filename, thread_info);
+
+	bool status = ts->texture(th, thread_info,
+	                          options, s, t, dsdx, dtdx, dsdy, dtdy, result);
+
 	if(!status) {
 		if(options.nchannels == 3 || options.nchannels == 4) {
 			result[0] = 1.0f;
@@ -797,8 +805,16 @@
                                   const OSL::Vec3 &dPdz, float *result)
 {
 	OSL::TextureSystem *ts = osl_ts;
-	bool status = ts->texture3d(filename, options, P, dPdx, dPdy, dPdz, result);
+	ShaderData *sd = (ShaderData *)(sg->renderstate);
+	KernelGlobals *kg = sd->osl_globals;
+	OSLThreadData *tdata = kg->osl_tdata;
+	OIIO::TextureSystem::Perthread *thread_info = tdata->oiio_thread_info;
 
+	OIIO::TextureSystem::TextureHandle *th =  ts->get_texture_handle(filename, thread_info);
+
+	bool status = ts->texture3d(th, thread_info,
+	                            options, P, dPdx, dPdy, dPdz, result);
+
 	if(!status) {
 		if(options.nchannels == 3 || options.nchannels == 4) {
 			result[0] = 1.0f;
@@ -819,8 +835,15 @@
                                     const OSL::Vec3 &dRdx, const OSL::Vec3 &dRdy, float *result)
 {
 	OSL::TextureSystem *ts = osl_ts;
-	bool status = ts->environment(filename, options, R, dRdx, dRdy, result);
+	ShaderData *sd = (ShaderData *)(sg->renderstate);
+	KernelGlobals *kg = sd->osl_globals;
+	OSLThreadData *tdata = kg->osl_tdata;
+	OIIO::TextureSystem::Perthread *thread_info = tdata->oiio_thread_info;
 
+	OIIO::TextureSystem::TextureHandle *th =  ts->get_texture_handle(filename, thread_info);
+	bool status = ts->environment(th, thread_info,
+	                              options, R, dRdx, dRdy, result);
+
 	if(!status) {
 		if(options.nchannels == 3 || options.nchannels == 4) {
 			result[0] = 1.0f;

Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp	2013-08-05 12:49:13 UTC (rev 58929)
+++ trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp	2013-08-05 12:49:15 UTC (rev 58930)
@@ -55,11 +55,13 @@
 	memset(&tdata->globals, 0, sizeof(OSL::ShaderGlobals));
 	tdata->globals.tracedata = &tdata->tracedata;
 	tdata->globals.flipHandedness = false;
-	tdata->thread_info = ss->create_thread_info();
+	tdata->osl_thread_info = ss->create_thread_info();
 
 	for(int i = 0; i < SHADER_CONTEXT_NUM; i++)
-		tdata->context[i] = ss->get_context(tdata->thread_info);
+		tdata->context[i] = ss->get_context(tdata->osl_thread_info);
 
+	tdata->oiio_thread_info = osl_globals->ts->get_perthread_info();
+
 	kg->osl_ss = (OSLShadingSystem*)ss;
 	kg->osl_tdata = tdata;
 }
@@ -75,7 +77,7 @@
 	for(int i = 0; i < SHADER_CONTEXT_NUM; i++)
 		ss->release_context(tdata->context[i]);
 
-	ss->destroy_thread_info(tdata->thread_info);
+	ss->destroy_thread_info(tdata->osl_thread_info);
 
 	delete tdata;
 




More information about the Bf-blender-cvs mailing list