public void DrawIndexedIndirect(Buffer indirectBuffer, uint offset, uint drawCount, uint stride) { PreDrawCommand(); OpenGLBuffer glBuffer = Util.AssertSubtype <Buffer, OpenGLBuffer>(indirectBuffer); glBindBuffer(BufferTarget.DrawIndirectBuffer, glBuffer.Buffer); CheckLastError(); glMultiDrawElementsIndirect(_primitiveType, _drawElementsType, (IntPtr)offset, drawCount, stride); CheckLastError(); }
private void FlushVertexLayouts() { uint totalSlotsBound = 0; VertexLayoutDescription[] layouts = _graphicsPipeline.GraphicsDescription.ShaderSet.VertexLayouts; for (int i = 0; i < layouts.Length; i++) { VertexLayoutDescription input = layouts[i]; OpenGLBuffer vb = _vertexBuffers[i]; glBindBuffer(BufferTarget.ArrayBuffer, vb.Buffer); uint offset = 0; for (uint slot = 0; slot < input.Elements.Length; slot++) { ref VertexElementDescription element = ref input.Elements[slot]; // Large structure -- use by reference. uint actualSlot = totalSlotsBound + slot; if (actualSlot >= _vertexAttributesBound) { glEnableVertexAttribArray(actualSlot); } VertexAttribPointerType type = OpenGLFormats.VdToGLVertexAttribPointerType( element.Format, out bool normalized); glVertexAttribPointer( actualSlot, FormatHelpers.GetElementCount(element.Format), type, normalized, (uint)_graphicsPipeline.VertexStrides[i], (void *)offset); uint stepRate = input.InstanceStepRate; if (_vertexAttribDivisors[actualSlot] != stepRate) { glVertexAttribDivisor(actualSlot, stepRate); _vertexAttribDivisors[actualSlot] = stepRate; } offset += FormatHelpers.GetSizeInBytes(element.Format); } totalSlotsBound += (uint)input.Elements.Length; }