Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/render/render_update.c4
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c12
-rw-r--r--source/blender/gpu/intern/gpu_material.c21
3 files changed, 35 insertions, 2 deletions
diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c
index e9fbb3a0885..1ed1cbb2c6b 100644
--- a/source/blender/editors/render/render_update.c
+++ b/source/blender/editors/render/render_update.c
@@ -156,12 +156,16 @@ void ED_render_engine_changed(Main *bmain)
/* on changing the render engine type, clear all running render engines */
bScreen *sc;
ScrArea *sa;
+ Scene *scene;
for (sc = bmain->screen.first; sc; sc = sc->id.next)
for (sa = sc->areabase.first; sa; sa = sa->next)
ED_render_engine_area_exit(sa);
RE_FreePersistentData();
+
+ for (scene = bmain->scene.first; scene; scene = scene->id.next)
+ ED_render_id_flush_update(bmain, &scene->id);
}
/***************************** Updates ***********************************
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index cef664437b7..7a0ac29c9ab 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -253,6 +253,9 @@ static void GPU_print_framebuffer_error(GLenum status, char err_out[256])
switch (status) {
case GL_FRAMEBUFFER_COMPLETE_EXT:
break;
+ case GL_INVALID_OPERATION:
+ err= "Invalid operation";
+ break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
err= "Incomplete attachment";
break;
@@ -754,6 +757,7 @@ int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char err
{
GLenum status;
GLenum attachment;
+ GLenum error;
if (tex->depth)
attachment = GL_DEPTH_ATTACHMENT_EXT;
@@ -766,6 +770,14 @@ int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char err
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment,
tex->target, tex->bindcode, 0);
+ error = glGetError();
+
+ if (error == GL_INVALID_OPERATION) {
+ GPU_framebuffer_restore();
+ GPU_print_framebuffer_error(error, err_out);
+ return 0;
+ }
+
if (tex->depth) {
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 497105d94ec..9c48f74bf5f 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -1497,6 +1497,16 @@ static GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)
return shr.combined;
}
+static GPUNodeLink *gpu_material_diffuse_bsdf(GPUMaterial *mat, Material *ma)
+{
+ static float roughness = 0.0f;
+ GPUNodeLink *outlink;
+
+ GPU_link(mat, "node_bsdf_diffuse", GPU_uniform(&ma->r), GPU_uniform(&roughness), GPU_builtin(GPU_VIEW_NORMAL), &outlink);
+
+ return outlink;
+}
+
GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
{
GPUMaterial *mat;
@@ -1516,8 +1526,15 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
ntreeGPUMaterialNodes(ma->nodetree, mat);
}
else {
- /* create material */
- outlink = GPU_blender_material(mat, ma);
+ if(BKE_scene_use_new_shading_nodes(scene)) {
+ /* create simple diffuse material instead of nodes */
+ outlink = gpu_material_diffuse_bsdf(mat, ma);
+ }
+ else {
+ /* create blender material */
+ outlink = GPU_blender_material(mat, ma);
+ }
+
GPU_material_output_link(mat, outlink);
}