diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index c706b10f1dd..a3ebda62126 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -167,11 +167,12 @@ GPUNodeLink *GPU_image(GPUMaterial *mat, struct Image *ima, struct ImageUser *iuser, eGPUSamplerState sampler_state); -GPUNodeLink *GPU_image_tiled(GPUMaterial *mat, - struct Image *ima, - struct ImageUser *iuser, - eGPUSamplerState sampler_state); -GPUNodeLink *GPU_image_tiled_mapping(GPUMaterial *mat, struct Image *ima, struct ImageUser *iuser); +void GPU_image_tiled(GPUMaterial *mat, + struct Image *ima, + struct ImageUser *iuser, + eGPUSamplerState sampler_state, + GPUNodeLink **r_image_tiled_link, + GPUNodeLink **r_image_tiled_mapping_link); GPUNodeLink *GPU_image_sky(GPUMaterial *mat, int width, int height, diff --git a/source/blender/gpu/intern/gpu_node_graph.cc b/source/blender/gpu/intern/gpu_node_graph.cc index a00f621d106..6e67d28b352 100644 --- a/source/blender/gpu/intern/gpu_node_graph.cc +++ b/source/blender/gpu/intern/gpu_node_graph.cc @@ -476,7 +476,7 @@ static GPUMaterialTexture *gpu_node_graph_add_texture(GPUNodeGraph *graph, ImageUser *iuser, struct GPUTexture **colorband, struct GPUTexture **sky, - GPUNodeLinkType link_type, + bool is_tiled, eGPUSamplerState sampler_state) { /* Find existing texture. */ @@ -502,7 +502,7 @@ static GPUMaterialTexture *gpu_node_graph_add_texture(GPUNodeGraph *graph, tex->sky = sky; tex->sampler_state = sampler_state; BLI_snprintf(tex->sampler_name, sizeof(tex->sampler_name), "samp%d", num_textures); - if (ELEM(link_type, GPU_NODE_LINK_IMAGE_TILED, GPU_NODE_LINK_IMAGE_TILED_MAPPING)) { + if (is_tiled) { BLI_snprintf( tex->tiled_mapping_name, sizeof(tex->tiled_mapping_name), "tsamp%d", num_textures); } @@ -631,7 +631,7 @@ GPUNodeLink *GPU_image(GPUMaterial *mat, GPUNodeLink *link = gpu_node_link_create(); link->link_type = GPU_NODE_LINK_IMAGE; link->texture = gpu_node_graph_add_texture( - graph, ima, iuser, nullptr, nullptr, link->link_type, sampler_state); + graph, ima, iuser, nullptr, nullptr, false, sampler_state); return link; } @@ -648,31 +648,28 @@ GPUNodeLink *GPU_image_sky(GPUMaterial *mat, GPUNodeLink *link = gpu_node_link_create(); link->link_type = GPU_NODE_LINK_IMAGE_SKY; link->texture = gpu_node_graph_add_texture( - graph, nullptr, nullptr, nullptr, sky, link->link_type, sampler_state); + graph, nullptr, nullptr, nullptr, sky, false, sampler_state); return link; } -GPUNodeLink *GPU_image_tiled(GPUMaterial *mat, - Image *ima, - ImageUser *iuser, - eGPUSamplerState sampler_state) +void GPU_image_tiled(GPUMaterial *mat, + struct Image *ima, + struct ImageUser *iuser, + eGPUSamplerState sampler_state, + GPUNodeLink **r_image_tiled_link, + GPUNodeLink **r_image_tiled_mapping_link) { GPUNodeGraph *graph = gpu_material_node_graph(mat); - GPUNodeLink *link = gpu_node_link_create(); - link->link_type = GPU_NODE_LINK_IMAGE_TILED; - link->texture = gpu_node_graph_add_texture( - graph, ima, iuser, nullptr, nullptr, link->link_type, sampler_state); - return link; -} + GPUMaterialTexture *texture = gpu_node_graph_add_texture( + graph, ima, iuser, nullptr, nullptr, true, sampler_state); -GPUNodeLink *GPU_image_tiled_mapping(GPUMaterial *mat, Image *ima, ImageUser *iuser) -{ - GPUNodeGraph *graph = gpu_material_node_graph(mat); - GPUNodeLink *link = gpu_node_link_create(); - link->link_type = GPU_NODE_LINK_IMAGE_TILED_MAPPING; - link->texture = gpu_node_graph_add_texture( - graph, ima, iuser, nullptr, nullptr, link->link_type, GPU_SAMPLER_MAX); - return link; + (*r_image_tiled_link) = gpu_node_link_create(); + (*r_image_tiled_link)->link_type = GPU_NODE_LINK_IMAGE_TILED; + (*r_image_tiled_link)->texture = texture; + + (*r_image_tiled_mapping_link) = gpu_node_link_create(); + (*r_image_tiled_mapping_link)->link_type = GPU_NODE_LINK_IMAGE_TILED_MAPPING; + (*r_image_tiled_mapping_link)->texture = texture; } GPUNodeLink *GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *row) @@ -684,7 +681,7 @@ GPUNodeLink *GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *ro GPUNodeLink *link = gpu_node_link_create(); link->link_type = GPU_NODE_LINK_COLORBAND; link->texture = gpu_node_graph_add_texture( - graph, nullptr, nullptr, colorband, nullptr, link->link_type, GPU_SAMPLER_MAX); + graph, nullptr, nullptr, colorband, nullptr, false, GPU_SAMPLER_MAX); return link; } diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.cc b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc index d8fb30396a3..6c2eb108e21 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_image.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc @@ -77,8 +77,8 @@ static int node_shader_gpu_tex_image(GPUMaterial *mat, if (ima->source == IMA_SRC_TILED) { const char *gpu_node_name = use_cubic ? "node_tex_tile_cubic" : "node_tex_tile_linear"; - GPUNodeLink *gpu_image = GPU_image_tiled(mat, ima, iuser, sampler_state); - GPUNodeLink *gpu_image_tile_mapping = GPU_image_tiled_mapping(mat, ima, iuser); + GPUNodeLink *gpu_image, *gpu_image_tile_mapping; + GPU_image_tiled(mat, ima, iuser, sampler_state, &gpu_image, &gpu_image_tile_mapping); /* UDIM tiles needs a `sampler2DArray` and `sampler1DArray` for tile mapping. */ GPU_stack_link(mat, node, gpu_node_name, in, out, gpu_image, gpu_image_tile_mapping); }