Skip to content

Commit

Permalink
Fix program manager default module insertion
Browse files Browse the repository at this point in the history
  • Loading branch information
tsherif committed Aug 28, 2019
1 parent 7ec55f3 commit 19b2f31
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 20 deletions.
35 changes: 15 additions & 20 deletions modules/core/src/resource-management/program-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,19 +60,13 @@ export default class ProgramManager {
}

get(props = {}) {
const {
vs = '',
fs = '',
defines = {},
modules = [],
inject = {},
varyings = [],
bufferMode = 0x8c8d
} = props; // varyings/bufferMode for xform feedback, 0x8c8d = SEPARATE_ATTRIBS
const {vs = '', fs = '', defines = {}, inject = {}, varyings = [], bufferMode = 0x8c8d} = props; // varyings/bufferMode for xform feedback, 0x8c8d = SEPARATE_ATTRIBS

const modules = this._getModuleList(props.modules); // Combine with default modules

const vsHash = this._getHash(vs);
const fsHash = this._getHash(fs);
const moduleHashes = this._getModuleNameList(modules);
const moduleHashes = modules.map(m => this._getHash(m)).sort();
const varyingHashes = varyings.map(v => this._getHash(v));

const defineKeys = Object.keys(defines).sort();
Expand Down Expand Up @@ -148,27 +142,28 @@ export default class ProgramManager {
}

// Dedup and combine with default modules
_getModuleNameList(modules) {
const moduleNames = new Array(this._defaultModules.length + modules.length);
_getModuleList(appModules = []) {
const modules = new Array(this._defaultModules.length + appModules.length);
const seen = {};
let count = 0;

for (let i = 0, len = this._defaultModules.length; i < len; ++i) {
const name = this._defaultModules[i].name;
moduleNames[count++] = name;
seen[name] = true;
const module = this._defaultModules[i];
modules[count++] = module;
seen[module.name] = true;
}

for (let i = 0, len = modules.length; i < len; ++i) {
const name = modules[i].name;
for (let i = 0, len = appModules.length; i < len; ++i) {
const module = appModules[i];
const name = module.name;
if (!seen[name]) {
moduleNames[count++] = name;
modules[count++] = module;
seen[name] = true;
}
}

moduleNames.length = count;
modules.length = count;

return moduleNames.sort();
return modules;
}
}
15 changes: 15 additions & 0 deletions modules/core/test/lib/program-manager.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@ test('ProgramManager#defaultModules', t => {
modules: [dirlight]
});

const moduleSource = moduleProgram.fs.source;

pm.addDefaultModule(dirlight);

const defaultModuleProgram = pm.get({vs, fs});
Expand All @@ -232,6 +234,19 @@ test('ProgramManager#defaultModules', t => {
t.ok(program === noDefaultModuleProgram, 'Default module was removed');
t.ok(moduleProgram !== noDefaultModuleProgram, 'Default module was removed');

// Reset program manager
pm.release(program);
pm.release(moduleProgram);
pm.release(defaultModuleProgram);
pm.release(noDefaultModuleProgram);

pm.addDefaultModule(dirlight);
const uncachedProgram = pm.get({vs, fs});
const defaultModuleSource = uncachedProgram.fs.source;

t.ok(defaultModuleProgram !== uncachedProgram, 'Program is not cached');
t.ok(moduleSource === defaultModuleSource, 'Default modules create correct source');

t.end();
});

Expand Down

0 comments on commit 19b2f31

Please sign in to comment.