Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <mano-wii>2022-09-01 14:21:10 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2022-09-01 14:25:55 +0300
commit6269d66da29ae000f214e775ee54dfc71623e642 (patch)
treecbf2fb0f29c3d770ede527e844a1e749f78c5522 /release
parent05fe7ca5af93208e56e3b120fa9caf157f43fc75 (diff)
PyGPU: GPUShader: implementation of 'attrs_info_get' method
With the new `attrs_info_get` method, we can get information about the attributes used in a `GPUShader` and thus have more freedom in the automatic creation of `GPUVertFormat`s Reviewed By: fclem, campbellbarton Differential Revision: https://developer.blender.org/D15764
Diffstat (limited to 'release')
-rw-r--r--release/scripts/modules/gpu_extras/batch.py33
1 files changed, 32 insertions, 1 deletions
diff --git a/release/scripts/modules/gpu_extras/batch.py b/release/scripts/modules/gpu_extras/batch.py
index 34dd1f16665..ba8e3879a8e 100644
--- a/release/scripts/modules/gpu_extras/batch.py
+++ b/release/scripts/modules/gpu_extras/batch.py
@@ -22,15 +22,46 @@ def batch_for_shader(shader, type, content, *, indices=None):
GPUBatch,
GPUIndexBuf,
GPUVertBuf,
+ GPUVertFormat,
)
+ def recommended_comp_type(attr_type):
+ if attr_type in {'FLOAT', 'VEC2', 'VEC3', 'VEC4', 'MAT3', 'MAT4'}:
+ return 'F32'
+ if attr_type in {'UINT', 'UVEC2', 'UVEC3', 'UVEC4'}:
+ return 'U32'
+ # `attr_type` in {'INT', 'IVEC2', 'IVEC3', 'IVEC4', 'BOOL'}.
+ return 'I32'
+
+ def recommended_attr_len(attr_name):
+ item = content[attr_name][0]
+ attr_len = 1
+ try:
+ while True:
+ attr_len *= len(item)
+ item = item[0]
+ except TypeError:
+ pass
+ return attr_len
+
+ def recommended_fetch_mode(comp_type):
+ if comp_type == 'F32':
+ return 'FLOAT'
+ return 'INT'
+
for data in content.values():
vbo_len = len(data)
break
else:
raise ValueError("Empty 'content'")
- vbo_format = shader.format_calc()
+ vbo_format = GPUVertFormat()
+ attrs_info = shader.attrs_info_get()
+ for name, attr_type in attrs_info:
+ comp_type = recommended_comp_type(attr_type)
+ attr_len = recommended_attr_len(name)
+ vbo_format.attr_add(id=name, comp_type=comp_type, len=attr_len, fetch_mode=recommended_fetch_mode(comp_type))
+
vbo = GPUVertBuf(vbo_format, vbo_len)
for id, data in content.items():