[Bf-blender-cvs] [7d0c12b0e08] temp-eevee-next-cryptomatte: Merge branch 'master' into temp-eevee-next-cryptomatte

Jeroen Bakker noreply at git.blender.org
Mon Sep 12 14:59:53 CEST 2022


Commit: 7d0c12b0e08d5dc686eefabc1326f0fb47a05188
Author: Jeroen Bakker
Date:   Mon Sep 12 12:57:48 2022 +0200
Branches: temp-eevee-next-cryptomatte
https://developer.blender.org/rB7d0c12b0e08d5dc686eefabc1326f0fb47a05188

Merge branch 'master' into temp-eevee-next-cryptomatte

===================================================================



===================================================================

diff --cc source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
index 20344653fcc,00000000000..00c4a86732e
mode 100644,000000..100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
@@@ -1,127 -1,0 +1,122 @@@
 +#include "BKE_cryptomatte.hh"
 +
 +#include "GPU_material.h"
 +
 +#include "eevee_cryptomatte.hh"
 +#include "eevee_instance.hh"
 +#include "eevee_renderbuffers.hh"
 +
 +namespace blender::eevee {
 +
 +void Cryptomatte::begin_sync()
 +{
 +  const eViewLayerEEVEEPassType enabled_passes = static_cast<eViewLayerEEVEEPassType>(
 +      inst_.film.enabled_passes_get() &
 +      (EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT | EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET |
 +       EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET));
 +
 +  session_.reset();
 +  object_layer_ = nullptr;
 +  asset_layer_ = nullptr;
 +  material_layer_ = nullptr;
 +
 +  if (enabled_passes && !inst_.is_viewport()) {
 +    session_.reset(BKE_cryptomatte_init_from_view_layer(inst_.view_layer));
 +
 +    for (const std::string &layer_name :
 +         bke::cryptomatte::BKE_cryptomatte_layer_names_get(*session_)) {
 +      StringRef layer_name_ref = layer_name;
 +      bke::cryptomatte::CryptomatteLayer *layer = bke::cryptomatte::BKE_cryptomatte_layer_get(
 +          *session_, layer_name);
 +      if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_OBJECT)) {
 +        object_layer_ = layer;
 +      }
 +      else if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_ASSET)) {
 +        asset_layer_ = layer;
 +      }
 +      else if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_MATERIAL)) {
 +        material_layer_ = layer;
 +      }
 +    }
 +  }
 +
 +  if (!(enabled_passes &
 +        (EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT | EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET))) {
 +    cryptomatte_object_buf.resize(16);
 +  }
 +}
 +
 +void Cryptomatte::sync_object(Object *ob)
 +{
 +  const eViewLayerEEVEEPassType enabled_passes = inst_.film.enabled_passes_get();
 +  if (!(enabled_passes &
 +        (EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT | EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET))) {
 +    return;
 +  }
 +
 +  uint32_t resource_id = DRW_object_resource_id_get(ob);
 +  float2 object_hashes(0.0f, 0.0f);
 +
 +  if (enabled_passes & EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT) {
 +    object_hashes[0] = register_id(EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT, ob->id);
 +  }
 +
 +  if (enabled_passes & EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET) {
 +    Object *asset = ob;
 +    while (asset->parent) {
 +      asset = asset->parent;
 +    }
 +    object_hashes[1] = register_id(EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET, asset->id);
 +  }
 +
 +  cryptomatte_object_buf.get_or_resize(resource_id) = object_hashes;
 +}
 +
 +void Cryptomatte::end_sync()
 +{
 +  cryptomatte_object_buf.push_update();
 +
 +  object_layer_ = nullptr;
 +  asset_layer_ = nullptr;
 +  material_layer_ = nullptr;
 +}
 +
 +float Cryptomatte::register_id(const eViewLayerEEVEEPassType layer, const ID &id) const
 +{
 +  BLI_assert(ELEM(layer,
 +                  EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT,
 +                  EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET,
 +                  EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL));
 +
 +  uint32_t cryptomatte_hash = 0;
 +  if (session_) {
 +    if (layer == EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT) {
 +      BLI_assert(object_layer_);
 +      cryptomatte_hash = object_layer_->add_ID(id);
 +    }
 +    else if (layer == EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET) {
 +      BLI_assert(asset_layer_);
 +      cryptomatte_hash = asset_layer_->add_ID(id);
 +    }
 +    else if (layer == EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT) {
 +      BLI_assert(material_layer_);
 +      cryptomatte_hash = material_layer_->add_ID(id);
 +    }
 +  }
 +  else {
 +    const char *name = &id.name[2];
 +    const int name_len = BLI_strnlen(name, MAX_NAME - 2);
 +    cryptomatte_hash = BKE_cryptomatte_hash(name, name_len);
 +  }
 +
 +  return BKE_cryptomatte_hash_to_float(cryptomatte_hash);
 +}
 +
- void Cryptomatte::bind_resources(DRWShadingGroup *grp)
- {
-   DRW_shgroup_storage_block_ref(grp, "cryptomatte_object_buf", &cryptomatte_object_buf);
- }
- 
 +void Cryptomatte::store_metadata(RenderResult *render_result)
 +{
 +  if (session_) {
 +    BKE_cryptomatte_store_metadata(&*session_, render_result, inst_.view_layer);
 +  }
 +}
 +
 +}  // namespace blender::eevee
diff --cc source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
index de7afc66693,00000000000..9bc5420d6f7
mode 100644,000000..100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
@@@ -1,66 -1,0 +1,69 @@@
 +/* SPDX-License-Identifier: GPL-2.0-or-later
 + * Copyright 2021 Blender Foundation.
 + */
 +
 +/** \file
 + * \ingroup eevee
 + *
 + * Cryptomatte.
 + *
 + * During rasterization, cryptomatte hashes are stored into a single array texture.
 + * The film pass then resamples this texture using pixel filter weighting.
 + * Each cryptomatte layer can hold N samples. These are stored in sequential layers
 + * of the array texture. The samples are sorted and merged only for final rendering.
 + */
 +
 +#pragma once
 +
 +#include "eevee_shader_shared.hh"
 +
 +#include "BKE_cryptomatte.hh"
 +
 +extern "C" {
 +struct Material;
 +struct CryptomatteSession;
 +}
 +
 +namespace blender::eevee {
 +
 +class Instance;
 +
 +/* -------------------------------------------------------------------- */
 +/** \name Cryptomatte
 + * \{ */
 +
 +class Cryptomatte {
 + private:
 +  class Instance &inst_;
 +
 +  bke::cryptomatte::CryptomatteSessionPtr session_;
 +
 +  /* Cached pointer to the cryptomatte layer instances. */
 +  bke::cryptomatte::CryptomatteLayer *object_layer_ = nullptr;
 +  bke::cryptomatte::CryptomatteLayer *asset_layer_ = nullptr;
 +  bke::cryptomatte::CryptomatteLayer *material_layer_ = nullptr;
 +
 +  /** Contains per object hashes (object and asset hash). Indexed by resource ID. */
 +  CryptomatteObjectBuf cryptomatte_object_buf;
 +
 + public:
 +  Cryptomatte(Instance &inst) : inst_(inst){};
 +
 +  void begin_sync();
 +  void sync_object(Object *ob);
 +  void end_sync();
 +
 +  void store_metadata(RenderResult *render_result);
 +
-   void bind_resources(DRWShadingGroup *grp);
++  template<typename T> void bind_resources(draw::detail::PassBase<T> *pass)
++  {
++    pass->bind_ssbo(CRYPTOMATTE_BUF_SLOT, &cryptomatte_object_buf);
++  }
 +
 +  /* Register ID to use inside cryptomatte layer and returns associated hash as float. */
 +  float register_id(const eViewLayerEEVEEPassType layer, const ID &id) const;
 +};
 +
 +/** \} */
 +
 +}  // namespace blender::eevee
diff --cc source/blender/draw/engines/eevee_next/eevee_defines.hh
index 67643471639,2f338e707c0..248dfae6df9
--- a/source/blender/draw/engines/eevee_next/eevee_defines.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_defines.hh
@@@ -68,3 -68,37 +68,40 @@@
  #define DOF_FILTER_GROUP_SIZE 8
  #define DOF_GATHER_GROUP_SIZE DOF_TILES_SIZE
  #define DOF_RESOLVE_GROUP_SIZE (DOF_TILES_SIZE * 2)
+ 
+ /* Resource bindings. */
+ 
+ /* Texture. */
+ #define RBUFS_UTILITY_TEX_SLOT 14
+ 
+ /* Images. */
+ #define RBUFS_NORMAL_SLOT 0
+ #define RBUFS_LIGHT_SLOT 1
+ #define RBUFS_DIFF_COLOR_SLOT 2
+ #define RBUFS_SPEC_COLOR_SLOT 3
+ #define RBUFS_EMISSION_SLOT 4
+ #define RBUFS_AOV_COLOR_SLOT 5
+ #define RBUFS_AOV_VALUE_SLOT 6
++#define RBUFS_CRYPTOMATTE_SLOT 7
+ 
+ /* Uniform Buffers. */
+ /* Only during prepass. */
+ #define VELOCITY_CAMERA_PREV_BUF 3
+ #define VELOCITY_CAMERA_CURR_BUF 4
+ #define VELOCITY_CAMERA_NEXT_BUF 5
+ 
+ /* Storage Buffers. */
+ #define LIGHT_CULL_BUF_SLOT 0
+ #define LIGHT_BUF_SLOT 1
+ #define LIGHT_ZBIN_BUF_SLOT 2
+ #define LIGHT_TILE_BUF_SLOT 3
+ #define RBUFS_AOV_BUF_SLOT 5
+ #define SAMPLING_BUF_SLOT 6
++#define CRYPTOMATTE_BUF_SLOT 7
++
+ /* Only during pre-pass. */
+ #define VELOCITY_OBJ_PREV_BUF_SLOT 0
+ #define VELOCITY_OBJ_NEXT_BUF_SLOT 1
+ #define VELOCITY_GEO_PREV_BUF_SLOT 2
+ #define VELOCITY_GEO_NEXT_BUF_SLOT 3
+ #define VELOCITY_INDIRECTION_BUF_SLOT 4
diff --cc source/blender/draw/engines/eevee_next/eevee_film.cc
index 9d6b0a4dcbc,4679889e59a..b4e63ac962b
--- a/source/blender/draw/engines/eevee_next/eevee_film.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_film.cc
@@@ -288,10 -270,10 +288,11 @@@ void Film::init(const int2 &extent, con
      data_.any_render_pass_2 = (enabled_passes_ & color_passes_2) != 0;
    }
    {
-     /* Set pass offsets.  */
+     /* Set pass offsets. */
  
      data_.display_id = aovs_info.display_id;
-     data_.display_storage_type = aovs_info.display_is_value ? PASS_STORAGE_VALUE : PASS_STORAGE_COLOR;
 -    data_.display_is_value = aovs_info.display_is_value;
++    data_.display_storage_type = aovs_info.display_is_value ? PASS_STORAGE_VALUE :
++                                                              PASS_STORAGE_COLOR;
  
      /* Combined is in a separate buffer. */
      data_.combined_id = (enabled_passes_ & EEVEE_RENDER_PASS_COMBINED) ? 0 : -1;
@@@ -421,70 -377,45 +422,62 @@@ void Film::sync(
     * Still bind previous step to avoid undefined behavior. */
    eVelocityStep step_next = inst_.is_viewport() ? STEP_PREVIOUS : STEP_NEXT;
  
-   DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS;
-   accumulate_ps_ = DRW_pass_create("Film.Accumulate", state);
-   GPUShader *sh = inst_.shaders.static_shader_get(shader);
-   DRWShadingGroup *grp = DRW_shgroup_create(sh, accumulate_ps_);
-   DRW_shgroup_uniform_block_ref(grp, "film_buf", &data_);
-   DRW_shgroup_uniform_block_ref(grp, "camera_prev", &(*velocity.camera_steps[STEP_PREVIOUS]));
-   DRW_shgroup_uniform_block_ref(grp, "camera_curr", &(*velocity.camera_steps[STEP_CURRENT]));
-   DRW_shgroup_uniform_block_ref(grp, "camera_next", &(*velocity.camera_steps[step_next]));
-   DRW_shgroup_uniform_texture_ref(grp, "depth_tx", &rbuffers.depth_tx);
-   DRW_shgroup_uniform_texture_ref(grp, "combined_tx", &combined_final_tx_);
-   DRW_shgroup_uniform_texture_ref(grp, "normal_tx", &rbuffers.normal_tx);
-   DRW_shgroup_uniform_texture_ref(grp, "vector_tx", &rbuffers.vector_tx);
-   DRW_shgroup_uniform_texture_ref(grp, "light_tx", &rbuffers.ligh

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list