2016-10-13 04:22:28 +00:00
|
|
|
/*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2005 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup gpu
|
2016-10-13 04:22:28 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2016-10-21 20:50:00 +00:00
|
|
|
#include <stdbool.h>
|
|
|
|
|
2020-03-19 08:06:49 +01:00
|
|
|
#include "DNA_scene_types.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "DNA_vec_types.h"
|
2017-02-07 11:20:15 +01:00
|
|
|
|
|
|
|
#include "GPU_framebuffer.h"
|
|
|
|
#include "GPU_texture.h"
|
|
|
|
|
2020-03-02 15:28:47 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2017-05-04 15:46:09 +02:00
|
|
|
#define GPU_INFO_SIZE 512 /* IMA_MAX_RENDER_TEXT */
|
2019-09-20 12:44:29 +02:00
|
|
|
#define GLA_PIXEL_OFS 0.375f
|
2017-05-04 15:46:09 +02:00
|
|
|
|
Materials: add custom object properties as uniform attributes.
This patch allows the user to type a property name into the
Attribute node, which will then output the value of the property
for each individual object, allowing to e.g. customize shaders
by object without duplicating the shader.
In order to make supporting this easier for Eevee, it is necessary
to explicitly choose whether the attribute is varying or uniform
via a dropdown option of the Attribute node. The dropdown also
allows choosing whether instancing should be taken into account.
The Cycles design treats all attributes as one common namespace,
so the Blender interface converts the enum to a name prefix that
can't be entered using keyboard.
In Eevee, the attributes are provided to the shader via a UBO indexed
with resource_id, similar to the existing Object Info data. Unlike it,
however, it is necessary to maintain a separate buffer for every
requested combination of attributes.
This is done using a hash table with the attribute set as the key,
as it is expected that technically different but similar materials
may use the same set of attributes. In addition, in order to minimize
wasted memory, a sparse UBO pool is implemented, so that chunks that
don't contain any data don't have to be allocated.
The back-end Cycles code is already refactored and committed by Brecht.
Differential Revision: https://developer.blender.org/D2057
2020-08-05 19:14:40 +03:00
|
|
|
typedef struct GHash GHash;
|
2016-10-13 04:22:28 +00:00
|
|
|
typedef struct GPUViewport GPUViewport;
|
|
|
|
|
2020-08-06 14:29:33 +02:00
|
|
|
struct GPUFrameBuffer;
|
|
|
|
|
2018-09-24 18:46:51 +02:00
|
|
|
/* Contains memory pools information */
|
2017-11-06 16:47:23 +01:00
|
|
|
typedef struct ViewportMemoryPool {
|
2019-05-31 01:45:41 +02:00
|
|
|
struct BLI_memblock *commands;
|
|
|
|
struct BLI_memblock *commands_small;
|
|
|
|
struct BLI_memblock *callbuffers;
|
|
|
|
struct BLI_memblock *obmats;
|
|
|
|
struct BLI_memblock *obinfos;
|
2019-05-20 18:01:42 +02:00
|
|
|
struct BLI_memblock *cullstates;
|
2019-05-07 18:01:14 +02:00
|
|
|
struct BLI_memblock *shgroups;
|
|
|
|
struct BLI_memblock *uniforms;
|
2019-05-20 18:01:42 +02:00
|
|
|
struct BLI_memblock *views;
|
2019-05-07 18:01:14 +02:00
|
|
|
struct BLI_memblock *passes;
|
|
|
|
struct BLI_memblock *images;
|
2020-08-20 23:09:37 +02:00
|
|
|
struct GPUUniformBuf **matrices_ubo;
|
|
|
|
struct GPUUniformBuf **obinfos_ubo;
|
Materials: add custom object properties as uniform attributes.
This patch allows the user to type a property name into the
Attribute node, which will then output the value of the property
for each individual object, allowing to e.g. customize shaders
by object without duplicating the shader.
In order to make supporting this easier for Eevee, it is necessary
to explicitly choose whether the attribute is varying or uniform
via a dropdown option of the Attribute node. The dropdown also
allows choosing whether instancing should be taken into account.
The Cycles design treats all attributes as one common namespace,
so the Blender interface converts the enum to a name prefix that
can't be entered using keyboard.
In Eevee, the attributes are provided to the shader via a UBO indexed
with resource_id, similar to the existing Object Info data. Unlike it,
however, it is necessary to maintain a separate buffer for every
requested combination of attributes.
This is done using a hash table with the attribute set as the key,
as it is expected that technically different but similar materials
may use the same set of attributes. In addition, in order to minimize
wasted memory, a sparse UBO pool is implemented, so that chunks that
don't contain any data don't have to be allocated.
The back-end Cycles code is already refactored and committed by Brecht.
Differential Revision: https://developer.blender.org/D2057
2020-08-05 19:14:40 +03:00
|
|
|
struct GHash *obattrs_ubo_pool;
|
2019-05-31 01:45:41 +02:00
|
|
|
uint ubo_len;
|
2017-11-06 16:47:23 +01:00
|
|
|
} ViewportMemoryPool;
|
|
|
|
|
2017-02-07 11:20:15 +01:00
|
|
|
/* All FramebufferLists are just the same pointers with different names */
|
|
|
|
typedef struct FramebufferList {
|
2017-04-12 19:49:19 +10:00
|
|
|
struct GPUFrameBuffer *framebuffers[0];
|
2017-02-07 11:20:15 +01:00
|
|
|
} FramebufferList;
|
|
|
|
|
|
|
|
typedef struct TextureList {
|
2017-04-12 19:49:19 +10:00
|
|
|
struct GPUTexture *textures[0];
|
2017-02-07 11:20:15 +01:00
|
|
|
} TextureList;
|
|
|
|
|
|
|
|
typedef struct PassList {
|
2017-04-12 19:49:19 +10:00
|
|
|
struct DRWPass *passes[0];
|
2017-02-07 11:20:15 +01:00
|
|
|
} PassList;
|
2016-10-13 04:22:28 +00:00
|
|
|
|
2017-02-08 21:44:13 +01:00
|
|
|
typedef struct StorageList {
|
2017-04-12 19:49:19 +10:00
|
|
|
void *storage[0]; /* custom structs from the engine */
|
2017-02-08 21:44:13 +01:00
|
|
|
} StorageList;
|
|
|
|
|
2017-03-08 20:00:09 +01:00
|
|
|
typedef struct ViewportEngineData {
|
2017-04-03 19:32:05 +02:00
|
|
|
void *engine_type;
|
2017-02-07 11:20:15 +01:00
|
|
|
|
2017-03-08 20:00:09 +01:00
|
|
|
FramebufferList *fbl;
|
|
|
|
TextureList *txl;
|
|
|
|
PassList *psl;
|
|
|
|
StorageList *stl;
|
2017-05-04 15:46:09 +02:00
|
|
|
char info[GPU_INFO_SIZE];
|
2017-03-26 19:25:45 +02:00
|
|
|
|
2020-03-19 08:06:49 +01:00
|
|
|
TextureList *txl_stereo;
|
|
|
|
StorageList *stl_stereo;
|
2017-04-28 04:33:58 +10:00
|
|
|
/* we may want to put this elsewhere */
|
|
|
|
struct DRWTextStore *text_draw_cache;
|
|
|
|
|
2017-03-26 19:25:45 +02:00
|
|
|
/* Profiling data */
|
|
|
|
double init_time;
|
|
|
|
double render_time;
|
|
|
|
double background_time;
|
2017-03-08 20:00:09 +01:00
|
|
|
} ViewportEngineData;
|
2017-02-07 11:20:15 +01:00
|
|
|
|
2017-04-12 19:49:19 +10:00
|
|
|
typedef struct ViewportEngineData_Info {
|
|
|
|
int fbl_len;
|
|
|
|
int txl_len;
|
|
|
|
int psl_len;
|
|
|
|
int stl_len;
|
|
|
|
} ViewportEngineData_Info;
|
|
|
|
|
2017-02-07 11:20:15 +01:00
|
|
|
GPUViewport *GPU_viewport_create(void);
|
2020-03-19 08:06:49 +01:00
|
|
|
GPUViewport *GPU_viewport_stereo_create(void);
|
|
|
|
void GPU_viewport_bind(GPUViewport *viewport, int view, const rcti *rect);
|
2017-02-07 11:20:15 +01:00
|
|
|
void GPU_viewport_unbind(GPUViewport *viewport);
|
2020-03-19 08:06:49 +01:00
|
|
|
void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *rect);
|
VR: Initial Virtual Reality support - Milestone 1, Scene Inspection
NOTE: While most of the milestone 1 goals are there, a few smaller features and
improvements are still to be done.
Big picture of this milestone: Initial, OpenXR-based virtual reality support
for users and foundation for advanced use cases.
Maniphest Task: https://developer.blender.org/T71347
The tasks contains more information about this milestone.
To be clear: This is not a feature rich VR implementation, it's focused on the
initial scene inspection use case. We intentionally focused on that, further
features like controller support are part of the next milestone.
- How to use?
Instructions on how to use this are here:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/How_to_Test
These will be updated and moved to a more official place (likely the manual) soon.
Currently Windows Mixed Reality and Oculus devices are usable. Valve/HTC
headsets don't support the OpenXR standard yet and hence, do not work with this
implementation.
---------------
This is the C-side implementation of the features added for initial VR
support as per milestone 1. A "VR Scene Inspection" Add-on will be
committed separately, to expose the VR functionality in the UI. It also
adds some further features for milestone 1, namely a landmarking system
(stored view locations in the VR space)
Main additions/features:
* Support for rendering viewports to an HMD, with good performance.
* Option to sync the VR view perspective with a fully interactive,
regular 3D View (VR-Mirror).
* Option to disable positional tracking. Keeps the current position (calculated
based on the VR eye center pose) when enabled while a VR session is running.
* Some regular viewport settings for the VR view
* RNA/Python-API to query and set VR session state information.
* WM-XR: Layer tying Ghost-XR to the Blender specific APIs/data
* wmSurface API: drawable, non-window container (manages Ghost-OpenGL and GPU
context)
* DNA/RNA for management of VR session settings
* `--debug-xr` and `--debug-xr-time` commandline options
* Utility batch & config file for using the Oculus runtime on Windows.
* Most VR data is runtime only. The exception is user settings which are saved
to files (`XrSessionSettings`).
* VR support can be disabled through the `WITH_XR_OPENXR` compiler flag.
For architecture and code documentation, see
https://wiki.blender.org/wiki/Source/Interface/XR.
---------------
A few thank you's:
* A huge shoutout to Ray Molenkamp for his help during the project - it would
have not been that successful without him!
* Sebastian Koenig and Simeon Conzendorf for testing and feedback!
* The reviewers, especially Brecht Van Lommel!
* Dalai Felinto for pushing and managing me to get this done ;)
* The OpenXR working group for providing an open standard. I think we're the
first bigger application to adopt OpenXR. Congratulations to them and
ourselves :)
This project started as a Google Summer of Code 2019 project - "Core Support of
Virtual Reality Headsets through OpenXR" (see
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/).
Some further information, including ideas for further improvements can be found
in the final GSoC report:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/Final_Report
Differential Revisions: D6193, D7098
Reviewed by: Brecht Van Lommel, Jeroen Bakker
2020-03-17 20:20:55 +01:00
|
|
|
void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
|
2020-03-19 08:06:49 +01:00
|
|
|
int view,
|
VR: Initial Virtual Reality support - Milestone 1, Scene Inspection
NOTE: While most of the milestone 1 goals are there, a few smaller features and
improvements are still to be done.
Big picture of this milestone: Initial, OpenXR-based virtual reality support
for users and foundation for advanced use cases.
Maniphest Task: https://developer.blender.org/T71347
The tasks contains more information about this milestone.
To be clear: This is not a feature rich VR implementation, it's focused on the
initial scene inspection use case. We intentionally focused on that, further
features like controller support are part of the next milestone.
- How to use?
Instructions on how to use this are here:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/How_to_Test
These will be updated and moved to a more official place (likely the manual) soon.
Currently Windows Mixed Reality and Oculus devices are usable. Valve/HTC
headsets don't support the OpenXR standard yet and hence, do not work with this
implementation.
---------------
This is the C-side implementation of the features added for initial VR
support as per milestone 1. A "VR Scene Inspection" Add-on will be
committed separately, to expose the VR functionality in the UI. It also
adds some further features for milestone 1, namely a landmarking system
(stored view locations in the VR space)
Main additions/features:
* Support for rendering viewports to an HMD, with good performance.
* Option to sync the VR view perspective with a fully interactive,
regular 3D View (VR-Mirror).
* Option to disable positional tracking. Keeps the current position (calculated
based on the VR eye center pose) when enabled while a VR session is running.
* Some regular viewport settings for the VR view
* RNA/Python-API to query and set VR session state information.
* WM-XR: Layer tying Ghost-XR to the Blender specific APIs/data
* wmSurface API: drawable, non-window container (manages Ghost-OpenGL and GPU
context)
* DNA/RNA for management of VR session settings
* `--debug-xr` and `--debug-xr-time` commandline options
* Utility batch & config file for using the Oculus runtime on Windows.
* Most VR data is runtime only. The exception is user settings which are saved
to files (`XrSessionSettings`).
* VR support can be disabled through the `WITH_XR_OPENXR` compiler flag.
For architecture and code documentation, see
https://wiki.blender.org/wiki/Source/Interface/XR.
---------------
A few thank you's:
* A huge shoutout to Ray Molenkamp for his help during the project - it would
have not been that successful without him!
* Sebastian Koenig and Simeon Conzendorf for testing and feedback!
* The reviewers, especially Brecht Van Lommel!
* Dalai Felinto for pushing and managing me to get this done ;)
* The OpenXR working group for providing an open standard. I think we're the
first bigger application to adopt OpenXR. Congratulations to them and
ourselves :)
This project started as a Google Summer of Code 2019 project - "Core Support of
Virtual Reality Headsets through OpenXR" (see
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/).
Some further information, including ideas for further improvements can be found
in the final GSoC report:
https://wiki.blender.org/wiki/User:Severin/GSoC-2019/Final_Report
Differential Revisions: D6193, D7098
Reviewed by: Brecht Van Lommel, Jeroen Bakker
2020-03-17 20:20:55 +01:00
|
|
|
const rcti *rect,
|
2021-01-26 14:05:50 +01:00
|
|
|
bool display_colorspace,
|
|
|
|
bool do_overlay_merge);
|
2016-10-13 04:22:28 +00:00
|
|
|
void GPU_viewport_free(GPUViewport *viewport);
|
|
|
|
|
2020-02-11 15:18:55 +01:00
|
|
|
void GPU_viewport_colorspace_set(GPUViewport *viewport,
|
|
|
|
ColorManagedViewSettings *view_settings,
|
|
|
|
ColorManagedDisplaySettings *display_settings,
|
|
|
|
float dither);
|
|
|
|
|
|
|
|
void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, struct GPUOffScreen *ofs);
|
|
|
|
void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport,
|
|
|
|
struct GPUOffScreen *ofs,
|
2021-01-26 14:05:50 +01:00
|
|
|
bool display_colorspace,
|
|
|
|
bool do_overlay_merge);
|
2017-05-03 02:50:29 +10:00
|
|
|
|
2017-11-06 16:47:23 +01:00
|
|
|
ViewportMemoryPool *GPU_viewport_mempool_get(GPUViewport *viewport);
|
2018-01-09 14:09:14 +01:00
|
|
|
struct DRWInstanceDataList *GPU_viewport_instance_data_list_get(GPUViewport *viewport);
|
2017-11-06 16:47:23 +01:00
|
|
|
|
2017-04-03 19:32:05 +02:00
|
|
|
void *GPU_viewport_engine_data_create(GPUViewport *viewport, void *engine_type);
|
2020-09-04 20:59:13 +02:00
|
|
|
void *GPU_viewport_engine_data_get(GPUViewport *viewport, void *engine_handle);
|
2017-03-08 20:00:09 +01:00
|
|
|
void *GPU_viewport_framebuffer_list_get(GPUViewport *viewport);
|
2020-03-19 08:06:49 +01:00
|
|
|
void GPU_viewport_stereo_composite(GPUViewport *viewport, Stereo3dFormat *stereo_format);
|
2017-03-08 20:00:09 +01:00
|
|
|
void *GPU_viewport_texture_list_get(GPUViewport *viewport);
|
2017-04-26 04:39:25 +10:00
|
|
|
void GPU_viewport_size_get(const GPUViewport *viewport, int size[2]);
|
|
|
|
void GPU_viewport_size_set(GPUViewport *viewport, const int size[2]);
|
2020-03-19 08:06:49 +01:00
|
|
|
void GPU_viewport_active_view_set(GPUViewport *viewport, int view);
|
2017-03-08 20:00:09 +01:00
|
|
|
|
2018-03-17 04:47:26 +01:00
|
|
|
/* Profiling */
|
|
|
|
double *GPU_viewport_cache_time_get(GPUViewport *viewport);
|
|
|
|
|
2017-09-25 20:07:02 +02:00
|
|
|
void GPU_viewport_tag_update(GPUViewport *viewport);
|
|
|
|
bool GPU_viewport_do_update(GPUViewport *viewport);
|
|
|
|
|
2020-03-19 08:06:49 +01:00
|
|
|
GPUTexture *GPU_viewport_color_texture(GPUViewport *viewport, int view);
|
2018-04-27 10:22:37 +02:00
|
|
|
|
2017-05-16 02:59:25 +02:00
|
|
|
/* Texture pool */
|
2018-04-30 16:02:24 +02:00
|
|
|
GPUTexture *GPU_viewport_texture_pool_query(
|
|
|
|
GPUViewport *viewport, void *engine, int width, int height, int format);
|
2017-05-16 02:59:25 +02:00
|
|
|
|
2019-05-07 18:42:28 +02:00
|
|
|
bool GPU_viewport_engines_data_validate(GPUViewport *viewport, void **engine_handle_array);
|
2017-11-06 16:47:23 +01:00
|
|
|
void GPU_viewport_cache_release(GPUViewport *viewport);
|
2017-02-07 11:20:15 +01:00
|
|
|
|
2020-08-06 14:29:33 +02:00
|
|
|
struct GPUFrameBuffer *GPU_viewport_framebuffer_default_get(GPUViewport *viewport);
|
|
|
|
struct GPUFrameBuffer *GPU_viewport_framebuffer_overlay_get(GPUViewport *viewport);
|
|
|
|
|
2020-03-02 15:28:47 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|