[Bf-blender-cvs] [b132e3b3ce1] master: Cycles: use GPU module for viewport display
Jason Fielder
noreply at git.blender.org
Thu Dec 1 15:55:57 CET 2022
Commit: b132e3b3ce1c5ecc836d22f4c4cba90e0ed2edcc
Author: Jason Fielder
Date: Thu Dec 1 15:33:54 2022 +0100
Branches: master
https://developer.blender.org/rBb132e3b3ce1c5ecc836d22f4c4cba90e0ed2edcc
Cycles: use GPU module for viewport display
To make GPU backends other than OpenGL work. Adds required pixel buffer and
fence objects to GPU module.
Authored by Apple: Michael Parkin-White
Ref T96261
Ref T92212
Reviewed By: fclem, brecht
Differential Revision: https://developer.blender.org/D16042
===================================================================
M intern/cycles/blender/display_driver.cpp
M intern/cycles/blender/display_driver.h
M source/blender/gpu/GPU_shader.h
M source/blender/gpu/GPU_state.h
M source/blender/gpu/GPU_texture.h
M source/blender/gpu/intern/gpu_backend.hh
M source/blender/gpu/intern/gpu_shader.cc
M source/blender/gpu/intern/gpu_state.cc
M source/blender/gpu/intern/gpu_state_private.hh
M source/blender/gpu/intern/gpu_texture.cc
M source/blender/gpu/intern/gpu_texture_private.hh
M source/blender/gpu/metal/mtl_backend.hh
M source/blender/gpu/metal/mtl_backend.mm
M source/blender/gpu/metal/mtl_command_buffer.mm
M source/blender/gpu/metal/mtl_context.hh
M source/blender/gpu/metal/mtl_state.hh
M source/blender/gpu/metal/mtl_state.mm
M source/blender/gpu/metal/mtl_texture.hh
M source/blender/gpu/metal/mtl_texture.mm
M source/blender/gpu/opengl/gl_backend.hh
M source/blender/gpu/opengl/gl_state.cc
M source/blender/gpu/opengl/gl_state.hh
M source/blender/gpu/opengl/gl_texture.cc
M source/blender/gpu/opengl/gl_texture.hh
M source/blender/render/RE_engine.h
M source/blender/render/intern/engine.cc
===================================================================
diff --git a/intern/cycles/blender/display_driver.cpp b/intern/cycles/blender/display_driver.cpp
index e2be4f85a9b..2469046eccf 100644
--- a/intern/cycles/blender/display_driver.cpp
+++ b/intern/cycles/blender/display_driver.cpp
@@ -5,9 +5,14 @@
#include "device/device.h"
#include "util/log.h"
+#include "util/math.h"
#include "util/opengl.h"
-#include "GPU_platform.h"
+#include "GPU_context.h"
+#include "GPU_immediate.h"
+#include "GPU_shader.h"
+#include "GPU_state.h"
+#include "GPU_texture.h"
#include "RE_engine.h"
@@ -30,8 +35,9 @@ unique_ptr<BlenderDisplayShader> BlenderDisplayShader::create(BL::RenderEngine &
int BlenderDisplayShader::get_position_attrib_location()
{
if (position_attribute_location_ == -1) {
- const uint shader_program = get_shader_program();
- position_attribute_location_ = glGetAttribLocation(shader_program, position_attribute_name);
+ GPUShader *shader_program = get_shader_program();
+ position_attribute_location_ = GPU_shader_get_attribute(shader_program,
+ position_attribute_name);
}
return position_attribute_location_;
}
@@ -39,8 +45,9 @@ int BlenderDisplayShader::get_position_attrib_location()
int BlenderDisplayShader::get_tex_coord_attrib_location()
{
if (tex_coord_attribute_location_ == -1) {
- const uint shader_program = get_shader_program();
- tex_coord_attribute_location_ = glGetAttribLocation(shader_program, tex_coord_attribute_name);
+ GPUShader *shader_program = get_shader_program();
+ tex_coord_attribute_location_ = GPU_shader_get_attribute(shader_program,
+ tex_coord_attribute_name);
}
return tex_coord_attribute_location_;
}
@@ -79,100 +86,42 @@ static const char *FALLBACK_FRAGMENT_SHADER =
" fragColor = texture(image_texture, texCoord_interp);\n"
"}\n\0";
-static void shader_print_errors(const char *task, const char *log, const char *code)
+static GPUShader *compile_fallback_shader(void)
{
- LOG(ERROR) << "Shader: " << task << " error:";
- LOG(ERROR) << "===== shader string ====";
-
- stringstream stream(code);
- string partial;
-
- int line = 1;
- while (getline(stream, partial, '\n')) {
- if (line < 10) {
- LOG(ERROR) << " " << line << " " << partial;
- }
- else {
- LOG(ERROR) << line << " " << partial;
- }
- line++;
- }
- LOG(ERROR) << log;
-}
-
-static int compile_fallback_shader(void)
-{
- const struct Shader {
- const char *source;
- const GLenum type;
- } shaders[2] = {{FALLBACK_VERTEX_SHADER, GL_VERTEX_SHADER},
- {FALLBACK_FRAGMENT_SHADER, GL_FRAGMENT_SHADER}};
-
- const GLuint program = glCreateProgram();
-
- for (int i = 0; i < 2; i++) {
- const GLuint shader = glCreateShader(shaders[i].type);
-
- string source_str = shaders[i].source;
- const char *c_str = source_str.c_str();
-
- glShaderSource(shader, 1, &c_str, NULL);
- glCompileShader(shader);
-
- GLint compile_status;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
-
- if (!compile_status) {
- GLchar log[5000];
- GLsizei length = 0;
- glGetShaderInfoLog(shader, sizeof(log), &length, log);
- shader_print_errors("compile", log, c_str);
- return 0;
- }
-
- glAttachShader(program, shader);
- }
-
- /* Link output. */
- glBindFragDataLocation(program, 0, "fragColor");
-
- /* Link and error check. */
- glLinkProgram(program);
-
- /* TODO(sergey): Find a way to nicely de-duplicate the error checking. */
- GLint link_status;
- glGetProgramiv(program, GL_LINK_STATUS, &link_status);
- if (!link_status) {
- GLchar log[5000];
- GLsizei length = 0;
- /* TODO(sergey): Is it really program passed to glGetShaderInfoLog? */
- glGetShaderInfoLog(program, sizeof(log), &length, log);
- shader_print_errors("linking", log, FALLBACK_VERTEX_SHADER);
- shader_print_errors("linking", log, FALLBACK_FRAGMENT_SHADER);
- return 0;
- }
-
- return program;
+ /* NOTE: Compilation errors are logged to console. */
+ GPUShader *shader = GPU_shader_create(FALLBACK_VERTEX_SHADER,
+ FALLBACK_FRAGMENT_SHADER,
+ nullptr,
+ nullptr,
+ nullptr,
+ "FallbackCyclesBlitShader");
+ return shader;
}
-void BlenderFallbackDisplayShader::bind(int width, int height)
+GPUShader *BlenderFallbackDisplayShader::bind(int width, int height)
{
create_shader_if_needed();
if (!shader_program_) {
- return;
+ return nullptr;
}
- glUseProgram(shader_program_);
- glUniform1i(image_texture_location_, 0);
- glUniform2f(fullscreen_location_, width, height);
+ /* Bind shader now to enable uniform assignment. */
+ GPU_shader_bind(shader_program_);
+ GPU_shader_uniform_int(shader_program_, image_texture_location_, 0);
+ float size[2];
+ size[0] = width;
+ size[1] = height;
+ GPU_shader_uniform_vector(shader_program_, fullscreen_location_, 2, 1, size);
+ return shader_program_;
}
void BlenderFallbackDisplayShader::unbind()
{
+ GPU_shader_unbind();
}
-uint BlenderFallbackDisplayShader::get_shader_program()
+GPUShader *BlenderFallbackDisplayShader::get_shader_program()
{
return shader_program_;
}
@@ -187,19 +136,18 @@ void BlenderFallbackDisplayShader::create_shader_if_needed()
shader_program_ = compile_fallback_shader();
if (!shader_program_) {
+ LOG(ERROR) << "Failed to compile fallback shader";
return;
}
- glUseProgram(shader_program_);
-
- image_texture_location_ = glGetUniformLocation(shader_program_, "image_texture");
+ image_texture_location_ = GPU_shader_get_uniform(shader_program_, "image_texture");
if (image_texture_location_ < 0) {
LOG(ERROR) << "Shader doesn't contain the 'image_texture' uniform.";
destroy_shader();
return;
}
- fullscreen_location_ = glGetUniformLocation(shader_program_, "fullscreen");
+ fullscreen_location_ = GPU_shader_get_uniform(shader_program_, "fullscreen");
if (fullscreen_location_ < 0) {
LOG(ERROR) << "Shader doesn't contain the 'fullscreen' uniform.";
destroy_shader();
@@ -209,8 +157,10 @@ void BlenderFallbackDisplayShader::create_shader_if_needed()
void BlenderFallbackDisplayShader::destroy_shader()
{
- glDeleteProgram(shader_program_);
- shader_program_ = 0;
+ if (shader_program_) {
+ GPU_shader_free(shader_program_);
+ shader_program_ = nullptr;
+ }
}
/* --------------------------------------------------------------------
@@ -224,9 +174,10 @@ BlenderDisplaySpaceShader::BlenderDisplaySpaceShader(BL::RenderEngine &b_engine,
DCHECK(b_engine_.support_display_space_shader(b_scene_));
}
-void BlenderDisplaySpaceShader::bind(int /*width*/, int /*height*/)
+GPUShader *BlenderDisplaySpaceShader::bind(int /*width*/, int /*height*/)
{
b_engine_.bind_display_space_shader(b_scene_);
+ return GPU_shader_get_bound();
}
void BlenderDisplaySpaceShader::unbind()
@@ -234,12 +185,11 @@ void BlenderDisplaySpaceShader::unbind()
b_engine_.unbind_display_space_shader();
}
-uint BlenderDisplaySpaceShader::get_shader_program()
+GPUShader *BlenderDisplaySpaceShader::get_shader_program()
{
if (!shader_program_) {
- glGetIntegerv(GL_CURRENT_PROGRAM, reinterpret_cast<int *>(&shader_program_));
+ shader_program_ = GPU_shader_get_bound();
}
-
if (!shader_program_) {
LOG(ERROR) << "Error retrieving shader program for display space shader.";
}
@@ -252,34 +202,34 @@ uint BlenderDisplaySpaceShader::get_shader_program()
*/
/* Higher level representation of a texture from the graphics library. */
-class GLTexture {
+class DisplayGPUTexture {
public:
- /* Global counter for all allocated OpenGL textures used by instances of this class. */
+ /* Global counter for all allocated GPUTextures used by instances of this class. */
static inline std::atomic<int> num_used = 0;
- GLTexture() = default;
+ DisplayGPUTexture() = default;
- ~GLTexture()
+ ~DisplayGPUTexture()
{
- assert(gl_id == 0);
+ assert(gpu_texture == nullptr);
}
- GLTexture(const GLTexture &other) = delete;
- GLTexture &operator=(GLTexture &other) = delete;
+ DisplayGPUTexture(const DisplayGPUTexture &other) = delete;
+ DisplayGPUTexture &operator=(DisplayGPUTexture &other) = delete;
- GLTexture(GLTexture &&other) noexcept
- : gl_id(other.gl_id), width(other.width), height(other.height)
+ DisplayGPUTexture(DisplayGPUTexture &&other) noexcept
+ : gpu_texture(other.gpu_texture), width(other.width), height(other.height)
{
other.reset();
}
- GLTexture &operator=(GLTexture &&other)
+ DisplayGPUTexture &operator=(DisplayGPUTexture &&other)
{
if (this == &other) {
return *this;
}
- gl_id = other.gl_id;
+ gpu_texture = other.gpu_texture;
width = other.width;
height = other.height;
@@ -288,55 +238,56 @@ class GLTexture {
return *this;
}
- bool gl_resources_ensure()
+ bool gpu_resources_ensure()
{
- if (gl_id) {
+ if (gpu_texture) {
return true;
}
- /* Create texture. */
- glGenTextures(1, &gl_id);
- if (!gl_id) {
+ /* Texture must have a minimum size of 1x1. */
+ gpu_texture = GPU_texture_create_2d(
+ "CyclesBlitTexture", max(width, 1), max(height, 1), 1, GPU_RGBA16F, nullptr);
+
+ if (!gpu_texture) {
LOG(ERROR) << "Error creating texture.";
return false;
}
- /* Configure the texture. */
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, gl_id);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
- /* Clamp to edge so that precision issues when zoomed out (which forces linear interpolation)
- * does not cause unwanted repetition. */
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- glBindTexture(GL_TEXTURE_2D, 0);
+ GPU_texture_filter_mode(g
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list