mirror of
https://github.com/rt64/rt64.git
synced 2024-12-29 12:31:50 +00:00
Add vertex and index buffer persistence
This commit is contained in:
parent
c357779b14
commit
6e8a394d5f
@ -42,7 +42,7 @@ namespace RT64 {
|
||||
MTLDepthClipMode depthClipMode = MTLDepthClipModeClip;
|
||||
MTLWinding winding = MTLWindingClockwise;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
struct MetalDescriptorSet : RenderDescriptorSet {
|
||||
MetalDevice *device = nullptr;
|
||||
@ -107,6 +107,11 @@ namespace RT64 {
|
||||
MTLIndexType currentIndexType = MTLIndexTypeUInt32;
|
||||
id<MTLBuffer> indexBuffer = nil;
|
||||
|
||||
uint32_t viewCount = 0;
|
||||
std::vector<id<MTLBuffer>> vertexBuffers;
|
||||
std::vector<uint32_t> vertexBufferOffsets;
|
||||
std::vector<uint32_t> vertexBufferIndices;
|
||||
|
||||
std::vector<MTLViewport> viewportVector;
|
||||
std::vector<MTLScissorRect> scissorVector;
|
||||
#endif
|
||||
@ -309,6 +314,10 @@ namespace RT64 {
|
||||
};
|
||||
|
||||
struct MetalGraphicsPipeline : MetalPipeline {
|
||||
#ifdef __OBJC__
|
||||
id<MTLRenderPipelineState> state = nil;
|
||||
#endif
|
||||
|
||||
MetalRenderState *renderState;
|
||||
MetalGraphicsPipeline(MetalDevice *device, const RenderGraphicsPipelineDesc &desc);
|
||||
~MetalGraphicsPipeline() override;
|
||||
|
@ -681,6 +681,7 @@ namespace RT64 {
|
||||
|
||||
NSError *error = nullptr;
|
||||
this->state = [device->device newRenderPipelineStateWithDescriptor: descriptor error: &error];
|
||||
renderState->renderPipelineState = state;
|
||||
|
||||
if (error != nullptr) {
|
||||
fprintf(stderr, "MTLDevice newRenderPipelineStateWithDescriptor: failed with error %s.\n", [error.localizedDescription cStringUsingEncoding: NSUTF8StringEncoding]);
|
||||
@ -872,6 +873,12 @@ namespace RT64 {
|
||||
|
||||
[renderEncoder setViewports: viewportVector.data() count: viewportVector.size()];
|
||||
[renderEncoder setScissorRects: scissorVector.data() count: scissorVector.size()];
|
||||
|
||||
for (uint32_t i = 0; i < viewCount; i++) {
|
||||
[renderEncoder setVertexBuffer: vertexBuffers[i]
|
||||
offset: vertexBufferOffsets[i]
|
||||
atIndex: vertexBufferIndices[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -958,7 +965,7 @@ namespace RT64 {
|
||||
guaranteeRenderEncoder();
|
||||
const auto *graphicsPipeline = static_cast<const MetalGraphicsPipeline *>(interfacePipeline);
|
||||
assert(renderEncoder != nil && "Cannot set pipeline state on nil MTLRenderCommandEncoder!");
|
||||
rebindRenderState(graphicsPipeline->state);
|
||||
rebindRenderState(graphicsPipeline->renderState);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -1012,17 +1019,32 @@ namespace RT64 {
|
||||
}
|
||||
|
||||
void MetalCommandList::setIndexBuffer(const RenderIndexBufferView *view) {
|
||||
// TODO: Argument Buffer Creation & Binding
|
||||
if (view != nullptr) {
|
||||
const auto *interfaceBuffer = static_cast<const MetalBuffer *>(view->buffer.ref);
|
||||
|
||||
indexBuffer = interfaceBuffer->buffer;
|
||||
}
|
||||
}
|
||||
|
||||
void MetalCommandList::setVertexBuffers(uint32_t startSlot, const RenderVertexBufferView *views, uint32_t viewCount, const RenderInputSlot *inputSlots) {
|
||||
// TODO: Argument Buffer Creation & Binding
|
||||
if ((views != nullptr) && (viewCount > 0)) {
|
||||
guaranteeRenderEncoder();
|
||||
assert(inputSlots != nullptr);
|
||||
|
||||
this->viewCount = viewCount;
|
||||
vertexBuffers.clear();
|
||||
vertexBufferOffsets.clear();
|
||||
vertexBufferIndices.clear();
|
||||
|
||||
for (uint32_t i = 0; i < viewCount; i++) {
|
||||
const MetalBuffer *interfaceBuffer = static_cast<const MetalBuffer *>(views[i].buffer.ref);
|
||||
vertexBuffers.emplace_back(interfaceBuffer->buffer);
|
||||
vertexBufferOffsets.emplace_back(views[i].buffer.offset);
|
||||
vertexBufferIndices.emplace_back(startSlot + i);
|
||||
|
||||
[renderEncoder setVertexBuffer: interfaceBuffer->buffer
|
||||
offset: views[i].buffer.offset
|
||||
atIndex: startSlot + i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user