Skip to content
Snippets Groups Projects
Commit 28ad4f42 authored by Alexander Rose's avatar Alexander Rose
Browse files

wip, uniform blocks

parent 3bd7299a
No related branches found
No related tags found
No related merge requests found
uniform mat4 uProjection, uModel, uView; uniform mat4 uProjection, uModel, uView;
uniform vec3 uCameraPosition; uniform vec3 uCameraPosition;
uniform Common {
mat4 uProjection;
int uObjectId;
int uInstanceCount;
} uboCommon;
uniform int uObjectId; uniform int uObjectId;
uniform int uInstanceCount; uniform int uInstanceCount;
uniform int uGroupCount; uniform int uGroupCount;
......
...@@ -76,6 +76,7 @@ export function getBufferType(ctx: WebGLContext, bufferType: BufferType) { ...@@ -76,6 +76,7 @@ export function getBufferType(ctx: WebGLContext, bufferType: BufferType) {
switch (bufferType) { switch (bufferType) {
case 'attribute': return gl.ARRAY_BUFFER case 'attribute': return gl.ARRAY_BUFFER
case 'elements': return gl.ELEMENT_ARRAY_BUFFER case 'elements': return gl.ELEMENT_ARRAY_BUFFER
case 'uniform': return (gl as WebGL2RenderingContext).UNIFORM_BUFFER
} }
} }
...@@ -214,4 +215,33 @@ export function createElementsBuffer(ctx: WebGLContext, array: ElementsType, usa ...@@ -214,4 +215,33 @@ export function createElementsBuffer(ctx: WebGLContext, array: ElementsType, usa
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, _buffer); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, _buffer);
} }
} }
} }
\ No newline at end of file
//
export type UniformType = Float32Array
export type UniformKind = 'float32'
// export type AttributeDefs = {
// [k: string]: { kind: ArrayKind, itemSize: BufferItemSize, divisor: number }
// }
// export type AttributeValues = { [k: string]: ValueCell<ArrayType> }
export type UniformBuffers = { [k: string]: UniformBuffer }
export interface UniformBuffer extends Buffer {
bind: (location: number) => void
}
export function createUniformBuffer(ctx: WebGLContext, array: UniformType, usageHint: UsageHint = 'dynamic'): UniformBuffer {
const gl = ctx.gl as WebGL2RenderingContext
const buffer = createBuffer(ctx, array, usageHint, 'uniform')
const { _buffer } = buffer
return {
...buffer,
bind: (location: number) => {
gl.bindBuffer(gl.UNIFORM_BUFFER, _buffer)
gl.bindBufferBase(gl.UNIFORM_BUFFER, location, _buffer)
}
}
}
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
import { ShaderCode, DefineValues, addShaderDefines } from '../shader-code' import { ShaderCode, DefineValues, addShaderDefines } from '../shader-code'
import { WebGLContext } from './context'; import { WebGLContext } from './context';
import { UniformValues, getUniformSetters } from './uniform'; import { UniformValues, getUniformSetters } from './uniform';
import { AttributeBuffers } from './buffer'; import { AttributeBuffers, UniformBuffers, createUniformBuffer } from './buffer';
import { Textures, TextureId } from './texture'; import { Textures, TextureId } from './texture';
import { createReferenceCache, ReferenceCache } from 'mol-util/reference-cache'; import { createReferenceCache, ReferenceCache } from 'mol-util/reference-cache';
import { idFactory } from 'mol-util/id-factory'; import { idFactory } from 'mol-util/id-factory';
...@@ -21,6 +21,8 @@ export interface Program { ...@@ -21,6 +21,8 @@ export interface Program {
use: () => void use: () => void
setUniforms: (uniformValues: UniformValues) => void setUniforms: (uniformValues: UniformValues) => void
setUniformBuffers: (uniformBuffers: UniformBuffers, uniformValues: UniformValues) => void
bindUniformBuffers: (/* uniformBuffers: UniformBuffers */) => void
bindAttributes: (attribueBuffers: AttributeBuffers) => void bindAttributes: (attribueBuffers: AttributeBuffers) => void
bindTextures: (textures: Textures) => void bindTextures: (textures: Textures) => void
...@@ -77,6 +79,32 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program { ...@@ -77,6 +79,32 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program {
const locations = getLocations(ctx, program, schema) const locations = getLocations(ctx, program, schema)
const uniformSetters = getUniformSetters(schema) const uniformSetters = getUniformSetters(schema)
interface UniformBufferInfo {
blockIndex: number,
blockSize: number,
uniformIndices: number[],
uniformOffsets: number[]
}
function getUniformBufferInfo(gl: WebGL2RenderingContext, program: WebGLProgram, name: string, uniformNames: string[]): UniformBufferInfo {
const blockIndex = gl.getUniformBlockIndex(program, name)
const blockSize = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE)
const uniformIndices = gl.getUniformIndices(program, uniformNames)
if (uniformIndices === null) throw new Error(`Could not get uniform indices`)
const uniformOffsets = gl.getActiveUniforms(program, uniformIndices, gl.UNIFORM_OFFSET)
return { blockIndex, blockSize, uniformIndices, uniformOffsets }
}
const uniformBufferInfos: { [k: string]: UniformBufferInfo } = {
'Common': getUniformBufferInfo(gl as WebGL2RenderingContext, program, 'Common', [
'Common.uProjection', 'Common.uObjectId', 'Common.uInstanceCount'
])
}
console.log(uniformBufferInfos)
const uniformBuffers: UniformBuffers = {
'Common': createUniformBuffer(ctx, new Float32Array(uniformBufferInfos['Common'].blockSize))
}
let destroyed = false let destroyed = false
return { return {
...@@ -96,6 +124,23 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program { ...@@ -96,6 +124,23 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program {
if (v) uniformSetters[k](gl, l, v.ref.value) if (v) uniformSetters[k](gl, l, v.ref.value)
} }
}, },
setUniformBuffers: (uniformBuffers: UniformBuffers, uniformValues: UniformValues) => {
const uniformBufferKeys = Object.keys(uniformBuffers)
for (let i = 0, il = uniformBufferKeys.length; i < il; ++i) {
// const k = uniformBufferKeys[i]
// const info = uniformBufferInfos[k]
// uniformBuffers[k].updateData()
}
},
bindUniformBuffers: (/* uniformBuffers: UniformBuffers */) => {
const uniformBufferKeys = Object.keys(uniformBuffers)
for (let i = 0, il = uniformBufferKeys.length; i < il; ++i) {
const k = uniformBufferKeys[i]
const info = uniformBufferInfos[k]
uniformBuffers[k].bind(i)
;(gl as WebGL2RenderingContext).uniformBlockBinding(program, info.blockIndex, i)
}
},
bindAttributes: (attribueBuffers: AttributeBuffers) => { bindAttributes: (attribueBuffers: AttributeBuffers) => {
const attributeKeys = Object.keys(attribueBuffers) const attributeKeys = Object.keys(attribueBuffers)
for (let i = 0, il = attributeKeys.length; i < il; ++i) { for (let i = 0, il = attributeKeys.length; i < il; ++i) {
......
...@@ -139,6 +139,7 @@ export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCo ...@@ -139,6 +139,7 @@ export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCo
const program = programs[variant].value const program = programs[variant].value
const vertexArray = vertexArrays[variant] const vertexArray = vertexArrays[variant]
program.setUniforms(uniformValues) program.setUniforms(uniformValues)
program.bindUniformBuffers()
if (vertexArrayObject && vertexArray) { if (vertexArrayObject && vertexArray) {
vertexArrayObject.bindVertexArray(vertexArray) vertexArrayObject.bindVertexArray(vertexArray)
// need to bind elements buffer explicitly since it is not always recorded in the VAO // need to bind elements buffer explicitly since it is not always recorded in the VAO
......
...@@ -8,6 +8,7 @@ import { Mat3, Mat4, Vec2, Vec3, Vec4 } from 'mol-math/linear-algebra' ...@@ -8,6 +8,7 @@ import { Mat3, Mat4, Vec2, Vec3, Vec4 } from 'mol-math/linear-algebra'
import { ValueCell } from 'mol-util'; import { ValueCell } from 'mol-util';
import { GLRenderingContext } from './compat'; import { GLRenderingContext } from './compat';
import { RenderableSchema } from 'mol-gl/renderable/schema'; import { RenderableSchema } from 'mol-gl/renderable/schema';
import { WebGLContext } from './context';
export type UniformKindValue = { export type UniformKindValue = {
'f': number 'f': number
...@@ -72,4 +73,18 @@ export function getUniformSetters(schema: RenderableSchema) { ...@@ -72,4 +73,18 @@ export function getUniformSetters(schema: RenderableSchema) {
} }
}) })
return setters return setters
}
//
export interface UniformBlock {
update(): void
bind(): void
}
export function createUniformBlock(ctx: WebGLContext, ) {
return {
}
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment