/// <summary> /// Initializes a new instance of the <see cref="EffectParameter"/> class. /// </summary> internal EffectParameter(EffectData.ValueTypeParameter parameterDescription, EffectConstantBuffer buffer) : base(parameterDescription.Name) { this.ParameterDescription = parameterDescription; this.buffer = buffer; ResourceType = EffectResourceType.None; IsValueType = true; ParameterClass = parameterDescription.Class; ParameterType = parameterDescription.Type; RowCount = parameterDescription.RowCount; ColumnCount = parameterDescription.ColumnCount; ElementCount = parameterDescription.Count; Offset = parameterDescription.Offset; Size = parameterDescription.Size; // If the expecting Matrix is column_major or the expected size is != from Matrix, than we need to remap SharpDX.Matrix to it. if (ParameterClass == EffectParameterClass.MatrixRows || ParameterClass == EffectParameterClass.MatrixColumns) { var isMatrixToMap = RowCount != 4 || ColumnCount != 4 || ParameterClass == EffectParameterClass.MatrixColumns; matrixSize = (ParameterClass == EffectParameterClass.MatrixColumns ? ColumnCount : RowCount) * 4 * sizeof(float); // Use the correct function for this parameter CopyMatrix = isMatrixToMap ? (ParameterClass == EffectParameterClass.MatrixRows) ? new CopyMatrixDelegate(CopyMatrixRowMajor) : CopyMatrixColumnMajor : CopyMatrixDirect; GetMatrixImpl = isMatrixToMap ? (ParameterClass == EffectParameterClass.MatrixRows) ? new GetMatrixDelegate(GetMatrixRowMajorFrom) : GetMatrixColumnMajorFrom : GetMatrixDirectFrom; } }
internal EffectConstantBuffer GetOrCreateConstantBuffer(GraphicsDevice context, EffectData.ConstantBuffer bufferRaw) { EffectConstantBuffer constantBuffer; // Is the effect is using shared constant buffers via the EffectPool? if (ShareConstantBuffers) { // Use the pool to share constant buffers constantBuffer = Pool.GetOrCreateConstantBuffer(context, bufferRaw); } else { // ---------------------------------------------------------------------------- // Get an existing constant buffer having the same name/sizel/ayout/parameters // ---------------------------------------------------------------------------- var bufferKey = new EffectConstantBufferKey(bufferRaw); if (!effectConstantBuffersCache.TryGetValue(bufferKey, out constantBuffer)) { // 4) If this buffer doesn't exist, create a new one and register it. constantBuffer = new EffectConstantBuffer(context, bufferRaw); effectConstantBuffersCache.Add(bufferKey, constantBuffer); DisposeCollector.Collect(constantBuffer); } } return(constantBuffer); }
internal EffectConstantBuffer GetOrCreateConstantBuffer(GraphicsDevice context, EffectData.ConstantBuffer bufferRaw) { // Only lock the constant buffer object lock (mapNameToConstantBuffer) { Dictionary <string, Dictionary <EffectConstantBufferKey, EffectConstantBuffer> > nameToConstantBufferList; // ---------------------------------------------------------------------------- // 1) Get the cache of constant buffers for a particular GraphicsDevice // ---------------------------------------------------------------------------- // TODO cache is not clear if a GraphicsDevice context is disposed // To simplify, we assume that a GraphicsDevice is alive during the whole life of the application. if (!mapNameToConstantBuffer.TryGetValue(context, out nameToConstantBufferList)) { nameToConstantBufferList = new Dictionary <string, Dictionary <EffectConstantBufferKey, EffectConstantBuffer> >(); mapNameToConstantBuffer[context] = nameToConstantBufferList; } // ---------------------------------------------------------------------------- // 2) Get a set of constant buffers for a particular constant buffer name // ---------------------------------------------------------------------------- Dictionary <EffectConstantBufferKey, EffectConstantBuffer> bufferSet; if (!nameToConstantBufferList.TryGetValue(bufferRaw.Name, out bufferSet)) { bufferSet = new Dictionary <EffectConstantBufferKey, EffectConstantBuffer>(); nameToConstantBufferList[bufferRaw.Name] = bufferSet; } // ---------------------------------------------------------------------------- // 3) Get an existing constant buffer having the same name/size/layout/parameters // ---------------------------------------------------------------------------- var bufferKey = new EffectConstantBufferKey(bufferRaw); EffectConstantBuffer buffer; if (!bufferSet.TryGetValue(bufferKey, out buffer)) { // 4) If this buffer doesn't exist, create a new one and register it. buffer = new EffectConstantBuffer(graphicsDevice, bufferRaw); bufferSet[bufferKey] = ToDispose(buffer); } return(buffer); } }
private static Buffer DefaultConstantBufferAllocator(GraphicsDevice device, EffectPool pool, EffectConstantBuffer constantBuffer) { return(Buffer.Constant.New(device, constantBuffer.Size)); }