If it helps performance, there can only be 3 shaders active at any
given time (one for path, another for light sampling, and third for
indirect path with non-progressive sampling). So you could create 3
contexts in advance.

Brecht.

On Tue, Sep 4, 2012 at 7:28 PM, Lukas Toenne
<[email protected]> wrote:
> Revision: 50394
>           
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50394
> Author:   lukastoenne
> Date:     2012-09-04 17:28:36 +0000 (Tue, 04 Sep 2012)
> Log Message:
> -----------
> Revert "Use one context per OSL thread. Not sure if this actually works, but 
> the simple renderer example in OSL does it this way."
>
> This does not actually work: The context must not be shared between threads, 
> but using the same context between different samples actually seems to 
> prevent OSL from switching between shaders. The proper solution would be to 
> ensure memory pooling works correctly.
>
> This reverts commit 69f87e69258d6266dcb20f09f7e3d4021e663432.
>
> Modified Paths:
> --------------
>     trunk/blender/intern/cycles/kernel/kernel_emission.h
>     trunk/blender/intern/cycles/kernel/kernel_path.h
>     trunk/blender/intern/cycles/kernel/kernel_shader.h
>     trunk/blender/intern/cycles/kernel/osl/osl_globals.h
>     trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
>     trunk/blender/intern/cycles/kernel/osl/osl_shader.h
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_emission.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_emission.h        2012-09-04 
> 17:09:40 UTC (rev 50393)
> +++ trunk/blender/intern/cycles/kernel/kernel_emission.h        2012-09-04 
> 17:28:36 UTC (rev 50394)
> @@ -54,6 +54,8 @@
>                         eval = make_float3(0.0f, 0.0f, 0.0f);
>         }
>
> +       shader_release(kg, &sd);
> +
>         return eval;
>  }
>
> @@ -162,6 +164,7 @@
>         ShaderData sd;
>         shader_setup_from_background(kg, &sd, ray);
>         float3 L = shader_eval_background(kg, &sd, path_flag);
> +       shader_release(kg, &sd);
>
>  #ifdef __BACKGROUND_MIS__
>         /* check if background light exists or if we should skip pdf */
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_path.h    2012-09-04 17:09:40 
> UTC (rev 50393)
> +++ trunk/blender/intern/cycles/kernel/kernel_path.h    2012-09-04 17:28:36 
> UTC (rev 50394)
> @@ -395,6 +395,8 @@
>                 label = shader_bsdf_sample(kg, &sd, bsdf_u, bsdf_v, 
> &bsdf_eval,
>                         &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf);
>
> +               shader_release(kg, &sd);
> +
>                 if(bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval))
>                         break;
>
> @@ -567,6 +569,8 @@
>                 label = shader_bsdf_sample(kg, &sd, bsdf_u, bsdf_v, 
> &bsdf_eval,
>                         &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf);
>
> +               shader_release(kg, &sd);
> +
>                 if(bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval))
>                         break;
>
> @@ -858,6 +862,7 @@
>
>                 /* continue in case of transparency */
>                 throughput *= shader_bsdf_transparency(kg, &sd);
> +               shader_release(kg, &sd);
>
>                 if(is_zero(throughput))
>                         break;
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_shader.h  2012-09-04 17:09:40 
> UTC (rev 50393)
> +++ trunk/blender/intern/cycles/kernel/kernel_shader.h  2012-09-04 17:28:36 
> UTC (rev 50394)
> @@ -773,5 +773,15 @@
>  }
>  #endif
>
> +/* Free ShaderData */
> +
> +__device void shader_release(KernelGlobals *kg, ShaderData *sd)
> +{
> +#ifdef __OSL__
> +       if (kernel_osl_use(kg))
> +               OSLShader::release(kg, sd);
> +#endif
> +}
> +
>  CCL_NAMESPACE_END
>
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_globals.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_globals.h        2012-09-04 
> 17:09:40 UTC (rev 50393)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_globals.h        2012-09-04 
> 17:28:36 UTC (rev 50394)
> @@ -64,7 +64,6 @@
>         struct ThreadData {
>                 OSL::ShaderGlobals globals;
>                 OSL::PerThreadInfo *thread_info;
> -               OSL::ShadingContext *ctx;
>         };
>
>         static tls_ptr(ThreadData, thread_data);
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp       2012-09-04 
> 17:09:40 UTC (rev 50393)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp       2012-09-04 
> 17:28:36 UTC (rev 50394)
> @@ -42,7 +42,6 @@
>
>         memset(&tdata->globals, 0, sizeof(OSL::ShaderGlobals));
>         tdata->thread_info = ss->create_thread_info();
> -       tdata->ctx = ss->get_context(tdata->thread_info);
>
>         tls_set(kg->osl.thread_data, tdata);
>
> @@ -55,7 +54,6 @@
>
>         OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, 
> kg->osl.thread_data);
>
> -       ss->release_context(tdata->ctx);
>         ss->destroy_thread_info(tdata->thread_info);
>
>         delete tdata;
> @@ -206,7 +204,7 @@
>         OSL::ShadingSystem *ss = kg->osl.ss;
>         OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, 
> kg->osl.thread_data);
>         OSL::ShaderGlobals *globals = &tdata->globals;
> -       OSL::ShadingContext *ctx = tdata->ctx;
> +       OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
>
>         /* setup shader globals from shader data */
>         sd->osl_ctx = ctx;
> @@ -264,7 +262,7 @@
>         OSL::ShadingSystem *ss = kg->osl.ss;
>         OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, 
> kg->osl.thread_data);
>         OSL::ShaderGlobals *globals = &tdata->globals;
> -       OSL::ShadingContext *ctx = tdata->ctx;
> +       OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
>
>         /* setup shader globals from shader data */
>         sd->osl_ctx = ctx;
> @@ -341,7 +339,7 @@
>         OSL::ShadingSystem *ss = kg->osl.ss;
>         OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, 
> kg->osl.thread_data);
>         OSL::ShaderGlobals *globals = &tdata->globals;
> -       OSL::ShadingContext *ctx = tdata->ctx;
> +       OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
>
>         /* setup shader globals from shader data */
>         sd->osl_ctx = ctx;
> @@ -365,7 +363,7 @@
>         OSL::ShadingSystem *ss = kg->osl.ss;
>         OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, 
> kg->osl.thread_data);
>         OSL::ShaderGlobals *globals = &tdata->globals;
> -       OSL::ShadingContext *ctx = tdata->ctx;
> +       OSL::ShadingContext *ctx = ss->get_context(tdata->thread_info);
>
>         /* setup shader globals from shader data */
>         sd->osl_ctx = ctx;
> @@ -381,6 +379,13 @@
>         sd->P = TO_FLOAT3(globals->P);
>  }
>
> +void OSLShader::release(KernelGlobals *kg, const ShaderData *sd)
> +{
> +       OSL::ShadingSystem *ss = kg->osl.ss;
> +
> +       ss->release_context((OSL::ShadingContext *)sd->osl_ctx);
> +}
> +
>  /* BSDF Closure */
>
>  int OSLShader::bsdf_sample(const ShaderData *sd, const ShaderClosure *sc, 
> float randu, float randv, float3& eval, float3& omega_in, differential3& 
> domega_in, float& pdf)
>
> Modified: trunk/blender/intern/cycles/kernel/osl/osl_shader.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/osl/osl_shader.h 2012-09-04 17:09:40 
> UTC (rev 50393)
> +++ trunk/blender/intern/cycles/kernel/osl/osl_shader.h 2012-09-04 17:28:36 
> UTC (rev 50394)
> @@ -77,6 +77,9 @@
>
>         static float3 volume_eval_phase(const ShaderData *sd, const 
> ShaderClosure *sc,
>                                         const float3 omega_in, const float3 
> omega_out);
> +
> +       /* release */
> +       static void release(KernelGlobals *kg, const ShaderData *sd);
>  };
>
>  CCL_NAMESPACE_END
>
> _______________________________________________
> Bf-blender-cvs mailing list
> [email protected]
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
_______________________________________________
Bf-committers mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-committers

Reply via email to