mirror of
https://github.com/blender/blender
synced 2026-10-25 03:07:01 +03:00
The new intersect_mnee kernel runs before shade_surface, and shade_surface_mnee is eliminated. That large kernel was causing problems for some GPU compilers. MNEE state is packed into a shadow path state to avoid significantly increasing the path state size. This shadow state is then either turned into an actual shadow ray state or discarded in shade_surface. MNEE was re-enabled on HIP RDNA2 as it works again now. Texture cache misses now also work correctly with MNEE. This adds some extra code to the regular shade_surface kernel even when MNEE is not used, to use the MNEE sampled point instead of sampling a light. But there seems to be no significant performance impact. Co-authored-by: Sergey Sharybin <sergey@blender.org> Pull Request: https://projects.blender.org/blender/blender/pulls/158698
140 lines
5.3 KiB
C++
140 lines
5.3 KiB
C++
/* SPDX-FileCopyrightText: 2011-2023 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
#ifdef __HIP_DEVICE_COMPILE__
|
|
|
|
# include "kernel/device/hip/compat.h"
|
|
# include "kernel/device/hip/config.h"
|
|
|
|
# include <hiprt/impl/hiprt_device_impl.h>
|
|
|
|
# include "kernel/device/hiprt/globals.h"
|
|
|
|
# include "kernel/device/gpu/image.h"
|
|
|
|
# include "kernel/tables.h"
|
|
|
|
# include "kernel/integrator/state.h"
|
|
# include "kernel/integrator/state_flow.h"
|
|
# include "kernel/integrator/state_util.h"
|
|
|
|
# include "kernel/integrator/intersect_closest.h"
|
|
# include "kernel/integrator/intersect_dedicated_light.h"
|
|
# include "kernel/integrator/intersect_mnee.h"
|
|
# include "kernel/integrator/intersect_shadow.h"
|
|
# include "kernel/integrator/intersect_subsurface.h"
|
|
# include "kernel/integrator/intersect_volume_stack.h"
|
|
# include "kernel/integrator/shade_surface.h"
|
|
|
|
ccl_gpu_kernel_threads(GPU_HIPRT_KERNEL_BLOCK_NUM_THREADS)
|
|
ccl_gpu_kernel_signature(integrator_intersect_closest,
|
|
const ccl_global int *path_index_array,
|
|
ccl_global float *render_buffer,
|
|
const int work_size,
|
|
ccl_global hiprtGlobalStackBuffer stack_buffer)
|
|
{
|
|
const int global_index = ccl_gpu_global_id_x();
|
|
|
|
if (global_index < work_size) {
|
|
HIPRT_INIT_KERNEL_GLOBAL()
|
|
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
|
|
ccl_gpu_kernel_call(integrator_intersect_closest(kg, state, render_buffer));
|
|
}
|
|
}
|
|
ccl_gpu_kernel_postfix
|
|
|
|
ccl_gpu_kernel_threads(GPU_HIPRT_KERNEL_BLOCK_NUM_THREADS)
|
|
ccl_gpu_kernel_signature(integrator_intersect_shadow,
|
|
const ccl_global int *path_index_array,
|
|
const int work_size,
|
|
ccl_global hiprtGlobalStackBuffer stack_buffer)
|
|
{
|
|
const int global_index = ccl_gpu_global_id_x();
|
|
|
|
if (global_index < work_size) {
|
|
HIPRT_INIT_KERNEL_GLOBAL()
|
|
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
|
|
ccl_gpu_kernel_call(integrator_intersect_shadow(kg, state));
|
|
}
|
|
}
|
|
ccl_gpu_kernel_postfix
|
|
|
|
ccl_gpu_kernel_threads(GPU_HIPRT_KERNEL_BLOCK_NUM_THREADS)
|
|
ccl_gpu_kernel_signature(integrator_intersect_subsurface,
|
|
const ccl_global int *path_index_array,
|
|
const int work_size,
|
|
ccl_global hiprtGlobalStackBuffer stack_buffer)
|
|
{
|
|
const int global_index = ccl_gpu_global_id_x();
|
|
|
|
if (global_index < work_size) {
|
|
HIPRT_INIT_KERNEL_GLOBAL()
|
|
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
|
|
ccl_gpu_kernel_call(integrator_intersect_subsurface(kg, state));
|
|
}
|
|
}
|
|
ccl_gpu_kernel_postfix
|
|
|
|
ccl_gpu_kernel_threads(GPU_HIPRT_KERNEL_BLOCK_NUM_THREADS)
|
|
ccl_gpu_kernel_signature(integrator_intersect_volume_stack,
|
|
const ccl_global int *path_index_array,
|
|
const int work_size,
|
|
ccl_global hiprtGlobalStackBuffer stack_buffer)
|
|
{
|
|
const int global_index = ccl_gpu_global_id_x();
|
|
|
|
if (global_index < work_size) {
|
|
HIPRT_INIT_KERNEL_GLOBAL()
|
|
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
|
|
ccl_gpu_kernel_call(integrator_intersect_volume_stack(kg, state));
|
|
}
|
|
}
|
|
|
|
ccl_gpu_kernel_threads(GPU_HIPRT_KERNEL_BLOCK_NUM_THREADS)
|
|
ccl_gpu_kernel_signature(integrator_intersect_dedicated_light,
|
|
const ccl_global int *path_index_array,
|
|
const int work_size,
|
|
ccl_global hiprtGlobalStackBuffer stack_buffer)
|
|
{
|
|
const int global_index = ccl_gpu_global_id_x();
|
|
|
|
if (global_index < work_size) {
|
|
HIPRT_INIT_KERNEL_GLOBAL()
|
|
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
|
|
ccl_gpu_kernel_call(integrator_intersect_dedicated_light(kg, state));
|
|
}
|
|
}
|
|
|
|
ccl_gpu_kernel_postfix
|
|
ccl_gpu_kernel_threads(GPU_HIPRT_KERNEL_BLOCK_NUM_THREADS)
|
|
ccl_gpu_kernel_signature(integrator_shade_surface_raytrace,
|
|
const ccl_global int *path_index_array,
|
|
ccl_global float *render_buffer,
|
|
const int work_size,
|
|
ccl_global hiprtGlobalStackBuffer stack_buffer)
|
|
{
|
|
const int global_index = ccl_gpu_global_id_x();
|
|
if (global_index < work_size) {
|
|
HIPRT_INIT_KERNEL_GLOBAL()
|
|
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
|
|
ccl_gpu_kernel_call(integrator_shade_surface_raytrace(kg, state, render_buffer));
|
|
}
|
|
}
|
|
ccl_gpu_kernel_postfix
|
|
ccl_gpu_kernel_threads(GPU_HIPRT_KERNEL_BLOCK_NUM_THREADS)
|
|
ccl_gpu_kernel_signature(integrator_intersect_mnee,
|
|
const ccl_global int *path_index_array,
|
|
const int work_size,
|
|
ccl_global hiprtGlobalStackBuffer stack_buffer)
|
|
{
|
|
const int global_index = ccl_gpu_global_id_x();
|
|
if (global_index < work_size) {
|
|
HIPRT_INIT_KERNEL_GLOBAL()
|
|
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
|
|
ccl_gpu_kernel_call(integrator_intersect_mnee(kg, state));
|
|
}
|
|
}
|
|
ccl_gpu_kernel_postfix
|
|
|
|
#endif /* __HIP_DEVICE_COMPILE__ */
|