UNPKG

kinetic-slider

Version:

A WebGL-powered kinetic slider component using PIXI.js

1 lines 26.9 kB
{"version":3,"file":"ShaderResourceManager.cjs","sources":["../../../src/managers/ShaderResourceManager.ts"],"sourcesContent":["/**\n * @file ShaderResourceManager.ts\n * @description Manages shader resources with pooling, caching, and performance monitoring.\n * Optimizes GPU resource usage by sharing shader programs across filters.\n */\n\nimport { GlProgram, Shader, Filter } from 'pixi.js';\n\n/**\n * Shader performance statistics\n */\ninterface ShaderStats {\n /** Number of times the shader was compiled */\n compilationCount: number;\n\n /** Number of times the shader was used/accessed */\n usageCount: number;\n\n /** Number of instances sharing this shader */\n instanceCount: number;\n\n /** Total time spent compiling in milliseconds */\n compilationTime: number;\n\n /** Time of the most recent usage */\n lastUsed: number;\n}\n\n/**\n * Shader resource entry for the pool\n */\ninterface ShaderEntry {\n /** The shader program instance */\n program: GlProgram;\n\n /** Optional unique identifier */\n id?: string;\n\n /** Filter type that created this shader */\n filterType: string;\n\n /** Performance statistics */\n stats: ShaderStats;\n\n /** Original vertex shader source */\n vertexSrc: string;\n\n /** Original fragment shader source */\n fragmentSrc: string;\n}\n\n/**\n * Configuration options for the ShaderResourceManager\n */\ninterface ShaderManagerOptions {\n /** Enable performance tracking */\n enableMetrics?: boolean;\n\n /** Enable debug logging */\n debug?: boolean;\n\n /** Maximum number of shaders to keep in the pool */\n maxPoolSize?: number;\n}\n\n/**\n * Manager for shader program resources with pooling and performance metrics\n *\n * Provides:\n * - Shader program pooling to share across filter instances\n * - Performance metrics tracking for shader compilation and usage\n * - Automatic cleanup of unused shaders\n */\nexport class ShaderResourceManager {\n /** Singleton instance of the shader manager */\n private static instance: ShaderResourceManager;\n\n /** Pool of shader programs indexed by hash */\n private shaderPool = new Map<string, ShaderEntry>();\n\n /** Map of filters to their associated shader hashes */\n private filterShaderMap = new Map<Filter, string>();\n\n /** Manager configuration */\n private options: ShaderManagerOptions;\n\n /** Is debug logging enabled */\n private debug = false;\n\n /**\n * Creates a new ShaderResourceManager instance\n *\n * @param options - Configuration options\n */\n private constructor(options: ShaderManagerOptions = {}) {\n this.options = {\n enableMetrics: options.enableMetrics ?? true,\n debug: options.debug ?? false,\n maxPoolSize: options.maxPoolSize ?? 100\n };\n\n this.debug = this.options.debug ?? false;\n\n this.log('ShaderResourceManager initialized');\n }\n\n /**\n * Get the singleton instance of the ShaderResourceManager\n *\n * @param options - Optional configuration options\n * @returns The singleton instance\n */\n public static getInstance(options: ShaderManagerOptions = {}): ShaderResourceManager {\n if (!ShaderResourceManager.instance) {\n ShaderResourceManager.instance = new ShaderResourceManager(options);\n }\n return ShaderResourceManager.instance;\n }\n\n /**\n * Log a message if debug is enabled\n *\n * @param message - Message to log\n */\n private log(message: string): void {\n if (this.debug) {\n console.log(`[ShaderResourceManager] ${message}`);\n }\n }\n\n /**\n * Generate a hash for a shader program based on its source code\n *\n * @param vertexSrc - Vertex shader source code\n * @param fragmentSrc - Fragment shader source code\n * @returns A hash string uniquely identifying the shader program\n */\n private generateShaderHash(vertexSrc: string, fragmentSrc: string): string {\n // Simple hashing function - could be improved for production\n const combinedSrc = `${vertexSrc}:${fragmentSrc}`;\n let hash = 0;\n\n for (let i = 0; i < combinedSrc.length; i++) {\n const char = combinedSrc.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n\n return `shader_${Math.abs(hash).toString(16)}`;\n }\n\n /**\n * Simplified method to get or create a shader program from a filter\n * This method extracts the shader source from the filter if available\n *\n * @param key - Unique identifier for the shader configuration\n * @param filter - The filter instance to extract shader from\n * @returns The shader program or undefined if extraction failed\n */\n public getShaderProgram(key: string, filter: Filter): GlProgram | undefined;\n public getShaderProgram(\n keyOrFilter: string | Filter,\n vertexSrcOrFilter?: string | Filter,\n fragmentSrc?: string,\n filterType?: string\n ): GlProgram | undefined {\n // Handle the simplified overload\n if (typeof keyOrFilter === 'string' && vertexSrcOrFilter instanceof Filter) {\n const key = keyOrFilter;\n const filter = vertexSrcOrFilter;\n\n // Check if we already have a mapping for this filter\n if (this.filterShaderMap.has(filter)) {\n const hash = this.filterShaderMap.get(filter);\n if (hash) {\n const entry = this.shaderPool.get(hash);\n\n if (entry) {\n // Update usage stats\n entry.stats.usageCount++;\n entry.stats.lastUsed = Date.now();\n this.log(`Using already mapped shader for ${key}`);\n return entry.program;\n }\n }\n }\n\n // Try to extract shader information from the filter\n try {\n // Most PixiJS filters use a program or shader property\n let program: GlProgram | null = null;\n let vertexSrc = '';\n let fragmentSrc = '';\n const extractedFilterType = filter.constructor.name;\n\n // First attempt: using a 'shader' property if it exists\n if ('shader' in filter && filter.shader) {\n if (filter.shader instanceof Shader && filter.shader.glProgram) {\n program = filter.shader.glProgram;\n\n // For newer versions of PixiJS, we might not have direct access to shader source\n // Instead, we'll use the key as a unique identifier\n const hash = `key_${key}_${Date.now()}`;\n\n // Create a new entry\n const entry: ShaderEntry = {\n program,\n filterType: extractedFilterType,\n vertexSrc: 'extracted', // Placeholder\n fragmentSrc: 'extracted', // Placeholder\n stats: {\n compilationCount: 0, // Not compiled by us\n usageCount: 1,\n instanceCount: 1,\n compilationTime: 0,\n lastUsed: Date.now()\n }\n };\n\n this.shaderPool.set(hash, entry);\n this.filterShaderMap.set(filter, hash);\n\n this.log(`Registered existing shader for ${key} (${extractedFilterType})`);\n return program;\n }\n }\n\n // If we couldn't extract properly, just map the filter to key for tracking\n // but don't try to manage the shader program\n const fallbackHash = `key_${key}_${Date.now()}`;\n this.log(`Could not extract shader source for ${key}, using basic tracking`);\n this.filterShaderMap.set(filter, fallbackHash);\n\n // If filter has a program property, use it directly\n if ('program' in filter &&\n typeof (filter as any).program === 'object' &&\n (filter as any).program !== null) {\n return (filter as any).program as GlProgram;\n }\n\n // Try to access shader.glProgram\n if ('shader' in filter &&\n (filter as any).shader &&\n typeof (filter as any).shader === 'object' &&\n 'glProgram' in (filter as any).shader &&\n (filter as any).shader.glProgram) {\n return (filter as any).shader.glProgram as GlProgram;\n }\n\n this.log(`Unable to access shader program for ${key}`);\n return undefined;\n } catch (error) {\n this.log(`Error extracting shader from filter: ${error}`);\n return undefined;\n }\n }\n\n // Handle the original implementation with full parameters\n if (typeof keyOrFilter === 'object' &&\n typeof vertexSrcOrFilter === 'string' &&\n typeof fragmentSrc === 'string' &&\n typeof filterType === 'string') {\n return this.getShaderProgramInternal(\n keyOrFilter,\n vertexSrcOrFilter,\n fragmentSrc,\n filterType\n );\n }\n\n this.log('Invalid parameters for getShaderProgram');\n return undefined;\n }\n\n /**\n * Internal implementation of getShaderProgram with all parameters\n */\n private getShaderProgramInternal(\n filter: Filter,\n vertexSrc: string,\n fragmentSrc: string,\n filterType: string\n ): GlProgram | undefined {\n const startTime = performance.now();\n const hash = this.generateShaderHash(vertexSrc, fragmentSrc);\n\n // Check if we already have this shader in the pool\n let entry = this.shaderPool.get(hash);\n\n if (entry) {\n // Update statistics\n entry.stats.usageCount++;\n entry.stats.instanceCount++;\n entry.stats.lastUsed = Date.now();\n\n // Map this filter to the shader hash\n this.filterShaderMap.set(filter, hash);\n\n this.log(`Reusing shader program ${hash} for ${filterType} filter`);\n return entry.program;\n }\n\n // For newer versions of PixiJS, we may not have the ability to create GlProgram directly\n // Instead, we'll track the filter and return undefined\n this.log(`Cannot directly create shader program in this PixiJS version`);\n\n // Create a fallback entry for tracking purposes\n const fallbackHash = `key_manual_${Date.now()}`;\n this.filterShaderMap.set(filter, fallbackHash);\n\n return undefined;\n }\n\n /**\n * Release a shader program by key\n *\n * @param key - The key used when getting the shader\n */\n public releaseShader(key: string): void;\n public releaseShader(filter: Filter | string): void {\n if (typeof filter === 'string') {\n // Find all filters using this key pattern\n const filtersToRelease: Filter[] = [];\n\n for (const [filterInstance, hash] of this.filterShaderMap.entries()) {\n if (hash.includes(`key_${filter}_`)) {\n filtersToRelease.push(filterInstance);\n }\n }\n\n // Release each filter\n for (const filterToRelease of filtersToRelease) {\n this.releaseShaderByFilter(filterToRelease);\n }\n\n return;\n }\n\n this.releaseShaderByFilter(filter);\n }\n\n /**\n * Release a shader program associated with a filter\n *\n * @param filter - The filter instance\n */\n private releaseShaderByFilter(filter: Filter): void {\n const hash = this.filterShaderMap.get(filter);\n\n if (!hash) {\n return; // No shader associated with this filter\n }\n\n const entry = this.shaderPool.get(hash);\n\n if (entry) {\n // Decrease instance count\n entry.stats.instanceCount--;\n\n // Remove only if there are no instances left\n if (entry.stats.instanceCount <= 0) {\n this.log(`Removing unused shader program ${hash}`);\n this.shaderPool.delete(hash);\n }\n }\n\n // Remove the filter mapping\n this.filterShaderMap.delete(filter);\n }\n\n /**\n * Prune the shader pool by removing the least recently used shaders\n * when the pool exceeds the maximum size\n */\n public pruneShaderPool(): void {\n if (this.shaderPool.size <= (this.options.maxPoolSize || 100)) {\n return; // No need to prune\n }\n\n // Sort entries by last used time (oldest first)\n const entries = Array.from(this.shaderPool.entries())\n .sort(([, a], [, b]) => a.stats.lastUsed - b.stats.lastUsed);\n\n // Determine how many to remove\n const removeCount = Math.ceil(this.shaderPool.size * 0.2); // Remove 20%\n\n // Remove oldest entries\n for (let i = 0; i < removeCount && i < entries.length; i++) {\n const [hash, entry] = entries[i];\n\n // Only remove if not in use\n if (entry.stats.instanceCount <= 0) {\n this.log(`Pruning shader ${hash} (last used: ${new Date(entry.stats.lastUsed).toISOString()})`);\n this.shaderPool.delete(hash);\n }\n }\n }\n\n /**\n * Get statistics about shader usage and the shader pool\n *\n * @returns Statistics object\n */\n public getStats(): Record<string, any> {\n const stats: Record<string, any> = {\n totalShaders: this.shaderPool.size,\n activeShaders: 0,\n totalCompilationTime: 0,\n avgCompilationTime: 0,\n totalUsage: 0,\n oldestShader: 0,\n newestShader: 0,\n shaderTypes: {}\n };\n\n if (this.shaderPool.size > 0) {\n for (const [, entry] of this.shaderPool.entries()) {\n // Count active shaders (those with instances > 0)\n if (entry.stats.instanceCount > 0) {\n stats.activeShaders++;\n }\n\n // Add to total compilation time\n stats.totalCompilationTime += entry.stats.compilationTime;\n\n // Add to total usage\n stats.totalUsage += entry.stats.usageCount;\n\n // Track by filter type\n if (!stats.shaderTypes[entry.filterType]) {\n stats.shaderTypes[entry.filterType] = 0;\n }\n stats.shaderTypes[entry.filterType]++;\n\n // Track oldest and newest\n if (stats.oldestShader === 0 || entry.stats.lastUsed < stats.oldestShader) {\n stats.oldestShader = entry.stats.lastUsed;\n }\n\n if (stats.newestShader === 0 || entry.stats.lastUsed > stats.newestShader) {\n stats.newestShader = entry.stats.lastUsed;\n }\n }\n\n // Calculate average compilation time\n stats.avgCompilationTime = stats.totalCompilationTime / this.shaderPool.size;\n }\n\n return stats;\n }\n\n /**\n * Registers a filter with the shader manager for tracking and optimization\n *\n * @param filter - The filter to register\n * @param key - Optional unique key to identify this filter's shader\n * @returns True if registration was successful\n */\n public registerFilter(filter: Filter, key?: string): boolean {\n if (!filter) {\n this.log('Cannot register null or undefined filter');\n return false;\n }\n\n try {\n // If no key provided, we'll generate one from the filter's shader when needed\n if (key) {\n this.filterShaderMap.set(filter, key);\n this.log(`Filter registered with key: ${key}`);\n } else {\n // The key will be generated when getShaderProgram is called\n this.log('Filter registered without key (will be auto-generated)');\n }\n return true;\n } catch (error) {\n this.log(`Error registering filter: ${error}`);\n return false;\n }\n }\n\n /**\n * Releases a filter from the shader manager\n *\n * @param filter - The filter to release\n * @param key - Optional key that was used to register the filter\n */\n public releaseFilter(filter: Filter, key?: string): void {\n if (!filter) {\n this.log('Cannot release null or undefined filter');\n return;\n }\n\n try {\n if (key) {\n this.filterShaderMap.delete(filter);\n this.log(`Filter with key ${key} released`);\n } else {\n this.releaseShaderByFilter(filter);\n }\n } catch (error) {\n this.log(`Error releasing filter: ${error}`);\n }\n }\n}"],"names":["Filter","fragmentSrc","Shader"],"mappings":"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"}