From 7a76f2ae77406feb29768e85f0e50affce928fac Mon Sep 17 00:00:00 2001 From: Miguel Pozo Date: Wed, 15 Feb 2023 23:54:51 +0100 Subject: [PATCH] Fix #104370: Draw: Don't request the same attribute more than once Avoid running out of attributes when multiple material slots use the same one. Cleanup: Removes the return value from drw_attributes_add_request since it shouldn't be modified afterward and it's never used. Avoid making copies of DRW_AttributeRequest in drw_attributes_has_request. Co-authored-by: Miguel Pozo Pull Request #104709 --- source/blender/draw/intern/draw_attributes.cc | 33 ++++++++----------- source/blender/draw/intern/draw_attributes.hh | 10 +++--- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/source/blender/draw/intern/draw_attributes.cc b/source/blender/draw/intern/draw_attributes.cc index 553832b0bf6..e1d53844f5a 100644 --- a/source/blender/draw/intern/draw_attributes.cc +++ b/source/blender/draw/intern/draw_attributes.cc @@ -4,20 +4,15 @@ #include "draw_attributes.hh" /* Return true if the given DRW_AttributeRequest is already in the requests. */ -static bool drw_attributes_has_request(const DRW_Attributes *requests, DRW_AttributeRequest req) +static bool drw_attributes_has_request(const DRW_Attributes *requests, + const DRW_AttributeRequest &req) { for (int i = 0; i < requests->num_requests; i++) { - const DRW_AttributeRequest src_req = requests->requests[i]; - if (src_req.domain != req.domain) { - continue; + const DRW_AttributeRequest &src_req = requests->requests[i]; + if (src_req.domain == req.domain && src_req.layer_index == req.layer_index && + src_req.cd_type == req.cd_type) { + return true; } - if (src_req.layer_index != req.layer_index) { - continue; - } - if (src_req.cd_type != req.cd_type) { - continue; - } - return true; } return false; } @@ -61,14 +56,15 @@ bool drw_attributes_overlap(const DRW_Attributes *a, const DRW_Attributes *b) return true; } -DRW_AttributeRequest *drw_attributes_add_request(DRW_Attributes *attrs, - const char *name, - const eCustomDataType type, - const int layer_index, - const eAttrDomain domain) +void drw_attributes_add_request(DRW_Attributes *attrs, + const char *name, + const eCustomDataType type, + const int layer_index, + const eAttrDomain domain) { - if (attrs->num_requests >= GPU_MAX_ATTR) { - return nullptr; + if (attrs->num_requests >= GPU_MAX_ATTR || + drw_attributes_has_request(attrs, {type, layer_index, domain})) { + return; } DRW_AttributeRequest *req = &attrs->requests[attrs->num_requests]; @@ -77,7 +73,6 @@ DRW_AttributeRequest *drw_attributes_add_request(DRW_Attributes *attrs, req->layer_index = layer_index; req->domain = domain; attrs->num_requests += 1; - return req; } bool drw_custom_data_match_attribute(const CustomData *custom_data, diff --git a/source/blender/draw/intern/draw_attributes.hh b/source/blender/draw/intern/draw_attributes.hh index 1449f7b3b8a..d5de4e1641b 100644 --- a/source/blender/draw/intern/draw_attributes.hh +++ b/source/blender/draw/intern/draw_attributes.hh @@ -60,11 +60,11 @@ void drw_attributes_merge(DRW_Attributes *dst, /* Return true if all requests in b are in a. */ bool drw_attributes_overlap(const DRW_Attributes *a, const DRW_Attributes *b); -DRW_AttributeRequest *drw_attributes_add_request(DRW_Attributes *attrs, - const char *name, - eCustomDataType data_type, - int layer_index, - eAttrDomain domain); +void drw_attributes_add_request(DRW_Attributes *attrs, + const char *name, + eCustomDataType data_type, + int layer_index, + eAttrDomain domain); bool drw_custom_data_match_attribute(const CustomData *custom_data, const char *name,