Esempio n. 1
0
        protected override void Destroy()
        {
            for (int i = 0; i < VertexBufferCount; i++)
            {
                vertexBuffers[i].Dispose();
            }

            activeVertexBufferIndex = -1;

            mappedVertexBufferPointer = IntPtr.Zero;

            if (indexBuffer != null)
            {
                indexBuffer.Dispose();
                indexBuffer = null;
            }

            indexBufferBinding = null;
            pipelineState      = null;

            if (simpleEffect != null)
            {
                simpleEffect.Dispose();
                simpleEffect = null;
            }

            for (int i = 0; i < VertexBufferCount; i++)
            {
                inputElementDescriptions[i] = null;
            }

            charsToRenderCount = -1;

            base.Destroy();
        }
Esempio n. 2
0
            public DeviceResourceContext(GraphicsDevice device, Effect effect, VertexDeclaration declaration, ResourceBufferInfo resourceBufferInfo, int indexStructSize)
            {
                var vertexSize = declaration.CalculateSize();

                VertexCount          = resourceBufferInfo.VertexCount;
                IndexCount           = resourceBufferInfo.IndexCount;
                IsIndexBufferDynamic = resourceBufferInfo.IsIndexBufferDynamic;

                VertexBuffer = Buffer.Vertex.New(device, VertexCount * vertexSize, GraphicsResourceUsage.Dynamic).DisposeBy(this);

                if (IsIndexBufferDynamic)
                {
                    IndexBuffer = Buffer.Index.New(device, IndexCount * indexStructSize, GraphicsResourceUsage.Dynamic).DisposeBy(this);
                }
                else
                {
                    IndexBuffer        = Buffer.Index.New(device, resourceBufferInfo.StaticIndices).DisposeBy(this);
                    IndexBuffer.Reload = graphicsResource => ((Buffer)graphicsResource).Recreate(resourceBufferInfo.StaticIndices);
                }

                var indexBufferBinding  = new IndexBufferBinding(IndexBuffer, indexStructSize == sizeof(int), IndexBuffer.Description.SizeInBytes / indexStructSize);
                var vertexBufferBinding = new VertexBufferBinding(VertexBuffer, declaration, VertexCount, vertexSize);

                // Creates a VAO
                VertexArrayObject = VertexArrayObject.New(device, effect.InputSignature, indexBufferBinding, vertexBufferBinding).DisposeBy(this);
            }
Esempio n. 3
0
            public Description(EffectInputSignature shaderSignature, VertexBufferBinding[] vertexBuffers, IndexBufferBinding indexBuffer)
            {
                ShaderSignature = shaderSignature;
                VertexBuffers   = vertexBuffers ?? emptyVertexBufferBindings;
                IndexBuffer     = indexBuffer;

                // Precompute hash code
                hashCode = 0;
                hashCode = ComputeHashCode();
            }
Esempio n. 4
0
        /// <summary>
        /// Initializes a FastTextRendering instance (create and build required ressources, ...).
        /// </summary>
        /// <param name="graphicsContext">The current GraphicsContext.</param>
        public unsafe FastTextRenderer Initialize([NotNull] GraphicsContext graphicsContext)
        {
            var indexBufferSize   = MaxCharactersPerLine * MaxCharactersLines * 6 * sizeof(int);
            var indexBufferLength = indexBufferSize / IndexStride;

            // Map and build the indice buffer
            indexBuffer = graphicsContext.Allocator.GetTemporaryBuffer(new BufferDescription(indexBufferSize, BufferFlags.IndexBuffer, GraphicsResourceUsage.Dynamic));

            var mappedIndices = graphicsContext.CommandList.MapSubresource(indexBuffer, 0, MapMode.WriteNoOverwrite, false, 0, indexBufferSize);
            var indexPointer  = mappedIndices.DataBox.DataPointer;

            var i = 0;

            for (var c = 0; c < MaxCharactersPerLine * MaxCharactersLines; c++)
            {
                *(int *)(indexPointer + IndexStride * i++) = c * 4 + 0;
                *(int *)(indexPointer + IndexStride * i++) = c * 4 + 1;
                *(int *)(indexPointer + IndexStride * i++) = c * 4 + 2;

                *(int *)(indexPointer + IndexStride * i++) = c * 4 + 1;
                *(int *)(indexPointer + IndexStride * i++) = c * 4 + 3;
                *(int *)(indexPointer + IndexStride * i++) = c * 4 + 2;
            }

            graphicsContext.CommandList.UnmapSubresource(mappedIndices);

            indexBufferBinding = new IndexBufferBinding(Buffer.Index.New(graphicsContext.CommandList.GraphicsDevice, new DataPointer(indexPointer, indexBufferSize)), true, indexBufferLength);

            // Create vertex buffers
            vertexBuffers = new Buffer[VertexBufferCount];
            for (int j = 0; j < VertexBufferCount; j++)
            {
                vertexBuffers[j] = Buffer.Vertex.New(graphicsContext.CommandList.GraphicsDevice, new VertexPositionNormalTexture[VertexBufferLength], GraphicsResourceUsage.Dynamic);
            }

            vertexBuffersBinding = new VertexBufferBinding[VertexBufferCount];
            for (int j = 0; j < VertexBufferCount; j++)
            {
                vertexBuffersBinding[j] = new VertexBufferBinding(vertexBuffers[j], VertexPositionNormalTexture.Layout, 0);
            }


            inputElementDescriptions = new InputElementDescription[VertexBufferCount][];
            for (int j = 0; j < VertexBufferCount; j++)
            {
                inputElementDescriptions[j] = vertexBuffersBinding[j].Declaration.CreateInputElements();
            }

            // Create the pipeline state object
            pipelineState = new MutablePipelineState(graphicsContext.CommandList.GraphicsDevice);
            pipelineState.State.SetDefaults();
            pipelineState.State.InputElements = inputElementDescriptions[0];
            pipelineState.State.PrimitiveType = PrimitiveType.TriangleList;

            // Create the effect
            simpleEffect = new EffectInstance(new Effect(graphicsContext.CommandList.GraphicsDevice, SpriteEffect.Bytecode));
            simpleEffect.Parameters.Set(SpriteBaseKeys.MatrixTransform, Matrix.Identity);
            simpleEffect.Parameters.Set(TexturingKeys.Texture0, DebugSpriteFont);
            simpleEffect.Parameters.Set(TexturingKeys.Sampler, graphicsContext.CommandList.GraphicsDevice.SamplerStates.LinearClamp);
            simpleEffect.Parameters.Set(SpriteEffectKeys.Color, TextColor);

            simpleEffect.UpdateEffect(graphicsContext.CommandList.GraphicsDevice);

            return(this);
        }
        private VertexArrayObject(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBufferBindings)
            : base(graphicsDevice)
        {
            this.vertexBufferBindings = vertexBufferBindings;
            this.indexBufferBinding   = indexBufferBinding;
            this.EffectInputSignature = shaderSignature;

            // Calculate Direct3D11 InputElement
            int inputElementCount = vertexBufferBindings.Sum(t => t.Declaration.VertexElements.Length);
            var inputElements     = new InputElement[inputElementCount];

            int j = 0;

            for (int i = 0; i < vertexBufferBindings.Length; i++)
            {
                var declaration = vertexBufferBindings[i].Declaration;
                vertexBufferBindings[i].Buffer.AddReferenceInternal();
                foreach (var vertexElementWithOffset in declaration.EnumerateWithOffsets())
                {
                    var vertexElement = vertexElementWithOffset.VertexElement;
                    inputElements[j++] = new InputElement
                    {
                        Slot              = i,
                        SemanticName      = vertexElement.SemanticName,
                        SemanticIndex     = vertexElement.SemanticIndex,
                        AlignedByteOffset = vertexElementWithOffset.Offset,
                        Format            = (SharpDX.DXGI.Format)vertexElement.Format,
                    };
                }
            }

            Layout = VertexArrayLayout.GetOrCreateLayout(new VertexArrayLayout(inputElements));

            if (indexBufferBinding != null)
            {
                indexBufferBinding.Buffer.AddReferenceInternal();
                indexBufferOffset = indexBufferBinding.Offset;
                indexFormat       = (indexBufferBinding.Is32Bit ? SharpDX.DXGI.Format.R32_UInt : SharpDX.DXGI.Format.R16_UInt);
            }

            CreateResources();
        }
Esempio n. 6
0
        private VertexArrayObject(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBufferBindings)
            : base(graphicsDevice)
        {
            this.vertexBufferBindings    = vertexBufferBindings;
            this.indexBufferBinding      = indexBufferBinding;
            this.preferredInputSignature = shaderSignature;

            // Increase the reference count on the provided buffers -> we do not want to take the ownership
            foreach (VertexBufferBinding vertexBufferBinding in vertexBufferBindings)
            {
                vertexBufferBinding.Buffer.AddReferenceInternal();
            }

            if (indexBufferBinding != null)
            {
                indexBufferBinding.Buffer.AddReferenceInternal();
            }

            CreateAttributes();
        }
Esempio n. 7
0
 private VertexArrayObject(GraphicsDevice graphicsDevice, object shaderSignature, IndexBufferBinding indexBufferBinding, VertexBufferBinding[] vertexBuffers)
 {
     throw new NotImplementedException();
 }
Esempio n. 8
0
        public static VertexArrayObject New(GraphicsDevice graphicsDevice, EffectInputSignature shaderSignature, IndexBufferBinding indexBufferBinding, params VertexBufferBinding[] vertexBufferBindings)
        {
            // Store SamplerState in a cache (D3D seems to have quite bad concurrency when using CreateSampler while rendering)
            VertexArrayObject vertexArrayObject;
            var description = new Description(shaderSignature, vertexBufferBindings, indexBufferBinding);

            lock (graphicsDevice.CachedVertexArrayObjects)
            {
                if (graphicsDevice.CachedVertexArrayObjects.TryGetValue(description, out vertexArrayObject))
                {
                    // TODO: Appropriate destroy
                    vertexArrayObject.AddReferenceInternal();
                }
                else
                {
                    vertexArrayObject = new VertexArrayObject(graphicsDevice, shaderSignature, indexBufferBinding, vertexBufferBindings);

                    // For now store description as is to avoid having to recreate it on Destroy.
                    // It would probably save little bit of memory space to try to reuse existing fields and add only what's missing.
                    vertexArrayObject.description = description;

                    graphicsDevice.CachedVertexArrayObjects.Add(description, vertexArrayObject);
                }
            }

            return(vertexArrayObject);
        }
Esempio n. 9
0
 public static VertexArrayObject New(GraphicsDevice graphicsDevice, IndexBufferBinding indexBufferBinding, params VertexBufferBinding[] vertexBufferBindings)
 {
     return(New(graphicsDevice, null, indexBufferBinding, vertexBufferBindings));
 }