|
213 | 213 | DEV_ASSERT(type == MDCommandBufferStateType::Render); |
214 | 214 |
|
215 | 215 | MDUniformSet *set = (MDUniformSet *)(p_uniform_set.id); |
216 | | - if (render.uniform_sets.size() <= set->index) { |
| 216 | + if (render.uniform_sets.size() <= p_set_index) { |
217 | 217 | uint32_t s = render.uniform_sets.size(); |
218 | | - render.uniform_sets.resize(set->index + 1); |
| 218 | + render.uniform_sets.resize(p_set_index + 1); |
219 | 219 | // Set intermediate values to null. |
220 | | - std::fill(&render.uniform_sets[s], &render.uniform_sets[set->index] + 1, nullptr); |
| 220 | + std::fill(&render.uniform_sets[s], &render.uniform_sets[p_set_index] + 1, nullptr); |
221 | 221 | } |
222 | 222 |
|
223 | | - if (render.uniform_sets[set->index] != set) { |
| 223 | + if (render.uniform_sets[p_set_index] != set) { |
224 | 224 | render.dirty.set_flag(RenderState::DIRTY_UNIFORMS); |
225 | | - render.uniform_set_mask |= 1ULL << set->index; |
226 | | - render.uniform_sets[set->index] = set; |
| 225 | + render.uniform_set_mask |= 1ULL << p_set_index; |
| 226 | + render.uniform_sets[p_set_index] = set; |
227 | 227 | } |
228 | 228 | } |
229 | 229 |
|
230 | 230 | void MDCommandBuffer::render_bind_uniform_sets(VectorView<RDD::UniformSetID> p_uniform_sets, RDD::ShaderID p_shader, uint32_t p_first_set_index, uint32_t p_set_count) { |
231 | 231 | DEV_ASSERT(type == MDCommandBufferStateType::Render); |
232 | 232 |
|
233 | | - for (size_t i = 0u; i < p_set_count; ++i) { |
| 233 | + for (size_t i = 0; i < p_set_count; ++i) { |
234 | 234 | MDUniformSet *set = (MDUniformSet *)(p_uniform_sets[i].id); |
235 | | - if (render.uniform_sets.size() <= set->index) { |
| 235 | + |
| 236 | + uint32_t index = p_first_set_index + i; |
| 237 | + if (render.uniform_sets.size() <= index) { |
236 | 238 | uint32_t s = render.uniform_sets.size(); |
237 | | - render.uniform_sets.resize(set->index + 1); |
| 239 | + render.uniform_sets.resize(index + 1); |
238 | 240 | // Set intermediate values to null. |
239 | | - std::fill(&render.uniform_sets[s], &render.uniform_sets[set->index] + 1, nullptr); |
| 241 | + std::fill(&render.uniform_sets[s], &render.uniform_sets[index] + 1, nullptr); |
240 | 242 | } |
241 | 243 |
|
242 | | - if (render.uniform_sets[set->index] != set) { |
| 244 | + if (render.uniform_sets[index] != set) { |
243 | 245 | render.dirty.set_flag(RenderState::DIRTY_UNIFORMS); |
244 | | - render.uniform_set_mask |= 1ULL << set->index; |
245 | | - render.uniform_sets[set->index] = set; |
| 246 | + render.uniform_set_mask |= 1ULL << index; |
| 247 | + render.uniform_sets[index] = set; |
246 | 248 | } |
247 | 249 | } |
248 | 250 | } |
|
474 | 476 |
|
475 | 477 | while (set_uniforms != 0) { |
476 | 478 | // Find the index of the next set bit. |
477 | | - int index = __builtin_ctzll(set_uniforms); |
| 479 | + uint32_t index = (uint32_t)__builtin_ctzll(set_uniforms); |
478 | 480 | // Clear the set bit. |
479 | 481 | set_uniforms &= (set_uniforms - 1); |
480 | 482 | MDUniformSet *set = render.uniform_sets[index]; |
481 | | - if (set == nullptr || set->index >= (uint32_t)shader->sets.size()) { |
| 483 | + if (set == nullptr || index >= (uint32_t)shader->sets.size()) { |
482 | 484 | continue; |
483 | 485 | } |
484 | | - set->bind_uniforms(shader, render); |
| 486 | + set->bind_uniforms(shader, render, index); |
485 | 487 | } |
486 | 488 | } |
487 | 489 |
|
|
955 | 957 |
|
956 | 958 | MDShader *shader = (MDShader *)(p_shader.id); |
957 | 959 | MDUniformSet *set = (MDUniformSet *)(p_uniform_set.id); |
958 | | - set->bind_uniforms(shader, compute); |
| 960 | + set->bind_uniforms(shader, compute, p_set_index); |
959 | 961 | } |
960 | 962 |
|
961 | 963 | void MDCommandBuffer::compute_bind_uniform_sets(VectorView<RDD::UniformSetID> p_uniform_sets, RDD::ShaderID p_shader, uint32_t p_first_set_index, uint32_t p_set_count) { |
|
966 | 968 | // TODO(sgc): Bind multiple buffers using [encoder setBuffers:offsets:withRange:] |
967 | 969 | for (size_t i = 0u; i < p_set_count; ++i) { |
968 | 970 | MDUniformSet *set = (MDUniformSet *)(p_uniform_sets[i].id); |
969 | | - set->bind_uniforms(shader, compute); |
| 971 | + set->bind_uniforms(shader, compute, p_first_set_index + i); |
970 | 972 | } |
971 | 973 | } |
972 | 974 |
|
|
1052 | 1054 | } |
1053 | 1055 | } |
1054 | 1056 |
|
1055 | | -void MDUniformSet::bind_uniforms_argument_buffers(MDShader *p_shader, MDCommandBuffer::RenderState &p_state) { |
| 1057 | +void MDUniformSet::bind_uniforms_argument_buffers(MDShader *p_shader, MDCommandBuffer::RenderState &p_state, uint32_t p_set_index) { |
1056 | 1058 | DEV_ASSERT(p_shader->uses_argument_buffers); |
1057 | 1059 | DEV_ASSERT(p_state.encoder != nil); |
1058 | 1060 |
|
1059 | | - UniformSet const &set_info = p_shader->sets[index]; |
| 1061 | + UniformSet const &set_info = p_shader->sets[p_set_index]; |
1060 | 1062 |
|
1061 | 1063 | id<MTLRenderCommandEncoder> __unsafe_unretained enc = p_state.encoder; |
1062 | 1064 | id<MTLDevice> __unsafe_unretained device = enc.device; |
|
1067 | 1069 | { |
1068 | 1070 | uint32_t const *offset = set_info.offsets.getptr(RDD::SHADER_STAGE_VERTEX); |
1069 | 1071 | if (offset) { |
1070 | | - [enc setVertexBuffer:bus.buffer offset:*offset atIndex:index]; |
| 1072 | + [enc setVertexBuffer:bus.buffer offset:*offset atIndex:p_set_index]; |
1071 | 1073 | } |
1072 | 1074 | } |
1073 | 1075 | // Set the buffer for the fragment stage. |
1074 | 1076 | { |
1075 | 1077 | uint32_t const *offset = set_info.offsets.getptr(RDD::SHADER_STAGE_FRAGMENT); |
1076 | 1078 | if (offset) { |
1077 | | - [enc setFragmentBuffer:bus.buffer offset:*offset atIndex:index]; |
| 1079 | + [enc setFragmentBuffer:bus.buffer offset:*offset atIndex:p_set_index]; |
1078 | 1080 | } |
1079 | 1081 | } |
1080 | 1082 | } |
1081 | 1083 |
|
1082 | | -void MDUniformSet::bind_uniforms_direct(MDShader *p_shader, MDCommandBuffer::RenderState &p_state) { |
| 1084 | +void MDUniformSet::bind_uniforms_direct(MDShader *p_shader, MDCommandBuffer::RenderState &p_state, uint32_t p_set_index) { |
1083 | 1085 | DEV_ASSERT(!p_shader->uses_argument_buffers); |
1084 | 1086 | DEV_ASSERT(p_state.encoder != nil); |
1085 | 1087 |
|
1086 | 1088 | id<MTLRenderCommandEncoder> __unsafe_unretained enc = p_state.encoder; |
1087 | 1089 |
|
1088 | | - UniformSet const &set = p_shader->sets[index]; |
| 1090 | + UniformSet const &set = p_shader->sets[p_set_index]; |
1089 | 1091 |
|
1090 | 1092 | for (uint32_t i = 0; i < MIN(uniforms.size(), set.uniforms.size()); i++) { |
1091 | 1093 | RDD::BoundUniform const &uniform = uniforms[i]; |
|
1256 | 1258 | } |
1257 | 1259 | } |
1258 | 1260 |
|
1259 | | -void MDUniformSet::bind_uniforms(MDShader *p_shader, MDCommandBuffer::RenderState &p_state) { |
| 1261 | +void MDUniformSet::bind_uniforms(MDShader *p_shader, MDCommandBuffer::RenderState &p_state, uint32_t p_set_index) { |
1260 | 1262 | if (p_shader->uses_argument_buffers) { |
1261 | | - bind_uniforms_argument_buffers(p_shader, p_state); |
| 1263 | + bind_uniforms_argument_buffers(p_shader, p_state, p_set_index); |
1262 | 1264 | } else { |
1263 | | - bind_uniforms_direct(p_shader, p_state); |
| 1265 | + bind_uniforms_direct(p_shader, p_state, p_set_index); |
1264 | 1266 | } |
1265 | 1267 | } |
1266 | 1268 |
|
1267 | | -void MDUniformSet::bind_uniforms_argument_buffers(MDShader *p_shader, MDCommandBuffer::ComputeState &p_state) { |
| 1269 | +void MDUniformSet::bind_uniforms_argument_buffers(MDShader *p_shader, MDCommandBuffer::ComputeState &p_state, uint32_t p_set_index) { |
1268 | 1270 | DEV_ASSERT(p_shader->uses_argument_buffers); |
1269 | 1271 | DEV_ASSERT(p_state.encoder != nil); |
1270 | 1272 |
|
1271 | | - UniformSet const &set_info = p_shader->sets[index]; |
| 1273 | + UniformSet const &set_info = p_shader->sets[p_set_index]; |
1272 | 1274 |
|
1273 | 1275 | id<MTLComputeCommandEncoder> enc = p_state.encoder; |
1274 | 1276 | id<MTLDevice> device = enc.device; |
|
1277 | 1279 |
|
1278 | 1280 | uint32_t const *offset = set_info.offsets.getptr(RDD::SHADER_STAGE_COMPUTE); |
1279 | 1281 | if (offset) { |
1280 | | - [enc setBuffer:bus.buffer offset:*offset atIndex:index]; |
| 1282 | + [enc setBuffer:bus.buffer offset:*offset atIndex:p_set_index]; |
1281 | 1283 | } |
1282 | 1284 | } |
1283 | 1285 |
|
1284 | | -void MDUniformSet::bind_uniforms_direct(MDShader *p_shader, MDCommandBuffer::ComputeState &p_state) { |
| 1286 | +void MDUniformSet::bind_uniforms_direct(MDShader *p_shader, MDCommandBuffer::ComputeState &p_state, uint32_t p_set_index) { |
1285 | 1287 | DEV_ASSERT(!p_shader->uses_argument_buffers); |
1286 | 1288 | DEV_ASSERT(p_state.encoder != nil); |
1287 | 1289 |
|
1288 | 1290 | id<MTLComputeCommandEncoder> __unsafe_unretained enc = p_state.encoder; |
1289 | 1291 |
|
1290 | | - UniformSet const &set = p_shader->sets[index]; |
| 1292 | + UniformSet const &set = p_shader->sets[p_set_index]; |
1291 | 1293 |
|
1292 | 1294 | for (uint32_t i = 0; i < uniforms.size(); i++) { |
1293 | 1295 | RDD::BoundUniform const &uniform = uniforms[i]; |
|
1407 | 1409 | } |
1408 | 1410 | } |
1409 | 1411 |
|
1410 | | -void MDUniformSet::bind_uniforms(MDShader *p_shader, MDCommandBuffer::ComputeState &p_state) { |
| 1412 | +void MDUniformSet::bind_uniforms(MDShader *p_shader, MDCommandBuffer::ComputeState &p_state, uint32_t p_set_index) { |
1411 | 1413 | if (p_shader->uses_argument_buffers) { |
1412 | | - bind_uniforms_argument_buffers(p_shader, p_state); |
| 1414 | + bind_uniforms_argument_buffers(p_shader, p_state, p_set_index); |
1413 | 1415 | } else { |
1414 | | - bind_uniforms_direct(p_shader, p_state); |
| 1416 | + bind_uniforms_direct(p_shader, p_state, p_set_index); |
1415 | 1417 | } |
1416 | 1418 | } |
1417 | 1419 |
|
|
0 commit comments