Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
516f349
docs(development): add a page on testing the multi-resolution volume …
wayfarer3130 Sep 23, 2026
6d9e4d0
Merge remote-tracking branch 'origin/master' into feat/multires-voxel…
wayfarer3130 Oct 5, 2026
2edb838
chore(ci): apply the CS3D_REF of the pull request in CircleCI and Net…
wayfarer3130 Sep 30, 2026
3e49657
chore(ci): keep libs/ out of the React Compiler lint budget
wayfarer3130 Sep 30, 2026
4c471c7
fix(cornerstone): skip frame updates in updateVolumeData when the vol…
wayfarer3130 Oct 5, 2026
e6c448c
feat(ci): read a checked-in .cs3d-ref when the PR body is not readable
wayfarer3130 Oct 5, 2026
52fc925
chore(ci): add .cs3d-ref for the CS3D multi-resolution branch
wayfarer3130 Oct 5, 2026
605a3c2
feat(cornerstone): state the GPU capability profile with a customization
wayfarer3130 Oct 5, 2026
cdddcc9
feat(cornerstone): use the medium GPU profile by default
wayfarer3130 Oct 5, 2026
6b70157
feat(cornerstone): load volumes with the coarse interleaved stages, a…
wayfarer3130 Oct 5, 2026
d26a4fa
chore(ci): point .cs3d-ref at the CS3D viewport fidelity branch
wayfarer3130 Oct 21, 2026
0d354a5
chore(ci): rebuild against the CS3D viewport fidelity branch
wayfarer3130 Oct 21, 2026
8b117e8
Merge branch 'master' into feat/multires-voxel-manager-base
wayfarer3130 Oct 21, 2026
57289bb
chore(ci): rebuild against the CS3D fidelity branch merged with main
wayfarer3130 Oct 21, 2026
2b19ccc
chore(ci): rebuild against the CS3D fidelity branch with the segmenta…
wayfarer3130 Oct 21, 2026
db96d78
Merge branch 'master' into feat/multires-voxel-manager-base
wayfarer3130 Oct 21, 2026
391c5aa
fix(ci): run the Netlify CLI outside the pnpm workspace overrides
wayfarer3130 Oct 21, 2026
5928723
Merge branch 'fix/ci-netlify-dlx-outside-workspace' into feat/multire…
wayfarer3130 Oct 21, 2026
3e5cffd
Merge remote-tracking branch 'origin/master' into feat/multires-voxel…
wayfarer3130 Oct 23, 2026
828180c
Revert "fix(ci): run the Netlify CLI outside the pnpm workspace overr…
wayfarer3130 Oct 23, 2026
0a718bd
chore(ci): rebuild against the CS3D fidelity branch with the merged s…
wayfarer3130 Oct 23, 2026
9da5b12
fix(cornerstone): restore the CS3D default GPU profile when the custo…
wayfarer3130 Oct 23, 2026
fb7899a
docs(cornerstone): state 2048 as the edge the GPU profiles assume, no…
wayfarer3130 Oct 23, 2026
ab9398f
Merge origin/master into feat/multires-voxel-manager-base
wayfarer3130 Oct 28, 2026
96e152b
docs(ci): take the fork section of the CS3D integration page from OHI…
wayfarer3130 Oct 28, 2026
2ec872e
docs(cornerstone): show the OHIF call sequence, and check the reducti…
wayfarer3130 Oct 28, 2026
57954ad
fix(ci): drop the Playwright CS3D preview, and fall back to the pinne…
wayfarer3130 Oct 28, 2026
899c631
docs(cornerstone): test the acquisition plane of the new viewports
wayfarer3130 Oct 28, 2026
1be81d9
Merge remote-tracking branch 'origin/master' into feat/multires-voxel…
wayfarer3130 Oct 29, 2026
76d1d4a
chore(ci): rebuild the previews against the CS3D branch feat/gpu-auto…
wayfarer3130 Oct 29, 2026
3fb5ff0
feat(cornerstone): select a GPU settings preset, and turn on lossy do…
wayfarer3130 Oct 29, 2026
c1f4f03
feat(config): turn on final downsampling in every app config except d…
wayfarer3130 Oct 29, 2026
a997175
Merge remote-tracking branch 'origin/master' into feat/multires-voxel…
wayfarer3130 Oct 30, 2026
d073b6b
fix(config): keep final downsampling off in deployment configs, and e…
wayfarer3130 Oct 30, 2026
c5f285e
chore(ci): rebuild against the CS3D #3018 hybrid (e00d13dcb)
wayfarer3130 Nov 3, 2026
5e4b823
chore(customizations): remove the gpu/auto preset until the automatic…
wayfarer3130 Nov 3, 2026
3ef335f
chore(ci): rebuild #6295 against CS3D #3018 (e00d13dcb)
wayfarer3130 Nov 3, 2026
57cf278
fix(cornerstone): mark every texture set dirty in updateVolumeData, a…
wayfarer3130 Nov 3, 2026
6801ae2
fix(cornerstone): NextViewportAdapter.isInAcquisitionPlane tests the …
wayfarer3130 Nov 3, 2026
513fbb4
test(cornerstone): restore the volume spy in afterEach; note the scro…
wayfarer3130 Nov 3, 2026
8161074
Merge remote-tracking branch 'origin/master' into feat/multires-voxel…
wayfarer3130 Nov 4, 2026
ca2345d
docs(multires): the new viewports come from the Cornerstone3D branch …
wayfarer3130 Nov 4, 2026
f84d4e5
chore(ci): rebuild against CS3D #2931 with #2992 and #3018 squashed in
wayfarer3130 Nov 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions extensions/cornerstone/src/commandsModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1492,14 +1492,8 @@ function commandsModule({
cornerstoneViewportService.storePresentation({ viewportId });
},
updateVolumeData: ({ volume }) => {
// update vtkOpenGLTexture and imageData of computed volume
const { imageData, vtkOpenGLTexture } = volume;
const numSlices = imageData.getDimensions()[2];
const slicesToUpdate = [...Array(numSlices).keys()];
slicesToUpdate.forEach(i => {
vtkOpenGLTexture.setUpdatedFrame(i);
});
imageData.modified();
// Marks the imageData and every texture set (full and reduced) of the computed volume dirty.
volume.modified();
},

attachProtocolViewportDataListener: ({ protocol, stageIndex }) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* The GPU settings preset that a deployment selects.
*
* The value is the `id` of a Cornerstone3D GPU settings preset: `auto`,
* `low-tablet`, `low`, `medium`, `high`, or `high-texture-4096`. A preset is a
* named set of values, the largest texture edge and the texture memory, and
* nothing probes the device to choose it. `auto` computes the values for the
* device, when the build of Cornerstone3D has `auto`.
*
* A preset applies only with final downsampling on. A value here turns final
* downsampling on, also in a locked-down config. `null`, the default, selects
* no preset: `appConfig.lossyDownsampling.final` then decides, with the
* default preset of Cornerstone3D.
*
* Set this value in the `bootstrap` phase or in the `global` phase of a
* `?customization=` module. `?customization=` needs `customizationUrlPrefixes`,
* and `config/default.js` has none: there, set the value through
* `customizationService` in the config. The shipped examples are
* `platform/app/public/customizations/gpu/<id>.jsonc`.
*/
export default {
'cornerstone.gpuSettingsPreset': null,
};
2 changes: 2 additions & 0 deletions extensions/cornerstone/src/getCustomizationModule.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import miscCustomization from './customizations/miscCustomization';
import captureViewportModalCustomization from './customizations/captureViewportModalCustomization';
import viewportDownloadWarningCustomization from './customizations/viewportDownloadWarningCustomization';
import getViewportScrollbarCustomization from './customizations/viewportScrollbarCustomization';
import gpuSettingsPresetCustomization from './customizations/gpuSettingsPresetCustomization';

function getCustomizationModule({ commandsManager, servicesManager, extensionManager }) {
return [
Expand Down Expand Up @@ -44,6 +45,7 @@ function getCustomizationModule({ commandsManager, servicesManager, extensionMan
...captureViewportModalCustomization,
...viewportDownloadWarningCustomization,
...getViewportScrollbarCustomization(),
...gpuSettingsPresetCustomization,
},
},
];
Expand Down
1 change: 0 additions & 1 deletion extensions/cornerstone/src/hps/mpr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ export const mpr: Types.HangingProtocol.Protocol = {
editableBy: {},
numberOfPriorsReferenced: 0,
protocolMatchingRules: [],
imageLoadStrategy: 'nth',
callbacks: {},
displaySetSelectors: {
activeDisplaySet: {
Expand Down
11 changes: 6 additions & 5 deletions extensions/cornerstone/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,14 @@ const cornerstoneExtension: Types.Extensions.Extension = {

// Configure the interleaved/HTJ2K loader
imageRetrieveMetadataProvider.clear();
// The default volume interleaved options are to interleave the
// image retrieve, but don't perform progressive loading per image
// This interleaves images and replicates them for low-resolution depth volume
// reconstruction, which progressively improves
// Volumes load every 64th image first and replicate it to the empty frames
// around it, then refine. A Cornerstone3D without the coarse stages keeps
// the stock interleaved stages.
const { ProgressiveRetrieveImages } = cornerstone;
imageRetrieveMetadataProvider.add(
'volume',
cornerstone.ProgressiveRetrieveImages.interleavedRetrieveStages
ProgressiveRetrieveImages.coarseInterleavedRetrieveStages ??
ProgressiveRetrieveImages.interleavedRetrieveStages
);

/**
Expand Down
10 changes: 10 additions & 0 deletions extensions/cornerstone/src/init.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import interleaveTopToBottom from './utils/interleaveTopToBottom';
import initContextMenu from './initContextMenu';
import initDoubleClick from './initDoubleClick';
import initViewTiming from './utils/initViewTiming';
import initGpuSettingsPreset from './utils/initGpuSettingsPreset';
import { colormaps } from './utils/colormaps';
import { SegmentationRepresentations } from '@cornerstonejs/tools/enums';
import { useLutPresentationStore } from './stores/useLutPresentationStore';
Expand Down Expand Up @@ -74,9 +75,14 @@ export default async function init({
const statsOverlay =
new URLSearchParams(window.location.search).get('debug') === 'true';

// appConfig.lossyDownsampling = { final, interactive, interleavedLoading }.
// An absent kind keeps the Cornerstone3D default: final off, the others on.
await cs3DInit({
peerImport: appConfig.peerImport,
debug: { statsOverlay },
...(appConfig.lossyDownsampling && {
rendering: { lossyDownsampling: appConfig.lossyDownsampling },
}),
});

cornerstone.setUseCPURendering(Boolean(appConfig.useCPURendering));
Expand Down Expand Up @@ -159,6 +165,10 @@ export default async function init({
toolbarService,
} = servicesManager.services;

// A volume viewport reads the GPU settings when it adds its actor, so the
// preset must apply before a mode opens a viewport.
initGpuSettingsPreset({ customizationService, appConfig });

toolbarService.registerEventForToolbarUpdate(colorbarService, [
colorbarService.EVENTS.STATE_CHANGED,
]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,30 @@ describe('classification', () => {
).toBe(false);
});

describe('isInAcquisitionPlane on a native volume', () => {
const axialCt = {
direction: [1, 0, 0, 0, 1, 0, 0, 0, 1],
dimensions: [512, 512, 100],
spacing: [0.7, 0.7, 2],
} as unknown as ReturnType<typeof cache.getVolume>;

beforeEach(() => jest.spyOn(cache, 'getVolume').mockReturnValue(axialCt));
afterEach(() => jest.restoreAllMocks());

it('tests the geometry, so axial on an axial CT counts', () => {
const axialOn = (viewPlaneNormal: number[]) =>
getViewportAdapter(
makeNextViewport({
getViewState: jest.fn().mockReturnValue({ orientation: OrientationAxis.AXIAL }),
getViewReference: jest.fn().mockReturnValue({ volumeId: 'ct', viewPlaneNormal }),
})
).isInAcquisitionPlane();

expect(axialOn([0, 0, 1])).toBe(true);
expect(axialOn([1, 0, 0])).toBe(false);
});
});

it('hasContent: legacy via actors, native via content mode', () => {
expect(getViewportAdapter(makeLegacyStackViewport()).hasContent()).toBe(true);
expect(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Enums, cache, Types as CoreTypes } from '@cornerstonejs/core';
import { Enums, cache, Types as CoreTypes, utilities as csUtils } from '@cornerstonejs/core';
import { isVolume3DViewportType } from '../../../utils/getLegacyViewportType';
import type {
IViewportAdapter,
Expand Down Expand Up @@ -70,6 +70,15 @@ export class NextViewportAdapter implements IViewportAdapter {
}

isInAcquisitionPlane(): boolean {
// A named orientation (axial on an axial CT) can be the acquisition plane, so test the geometry.
const reference = this.viewport.getViewReference?.();
const volume = reference?.volumeId ? cache.getVolume(reference.volumeId) : undefined;
const { isAcquisitionPlaneNormal } = csUtils;

if (volume && reference.viewPlaneNormal && typeof isAcquisitionPlaneNormal === 'function') {
return isAcquisitionPlaneNormal(volume, reference.viewPlaneNormal as CoreTypes.Point3);
}

// orientation defaults to ACQUISITION when unset on the native view state.
const orientation = this.viewport.getViewState?.()?.orientation;
return orientation === Enums.OrientationAxis.ACQUISITION || orientation == null;
Expand Down
76 changes: 76 additions & 0 deletions extensions/cornerstone/src/utils/initGpuSettingsPreset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import * as cornerstone from '@cornerstonejs/core';

const CUSTOMIZATION_ID = 'cornerstone.gpuSettingsPreset';

/**
* Selects the GPU settings preset from the `cornerstone.gpuSettingsPreset`
* customization, and turns on final downsampling when the customization
* states a preset.
*
* A preset is a named set of GPU settings in Cornerstone3D: the largest
* texture edge and the texture memory. With final downsampling on, a volume
* viewport reduces its texture to fit those values. The value `auto` asks
* Cornerstone3D to compute the settings for the device, when the build of
* Cornerstone3D has `auto`.
*
* - The customization states a preset: final downsampling is on, with that
* preset, also in a locked-down config such as `config/default.js`. That
* config has no `customizationUrlPrefixes`, so it must set the value through
* `customizationService` in the config, not with `?customization=`.
* - The customization states no preset: `appConfig.lossyDownsampling.final`
* decides, with the default preset of Cornerstone3D.
*
* A viewport reads the preset when it adds its actor, so the value must arrive
* before a mode opens a viewport. The `bootstrap` phase of a `?customization=`
* module applies before this extension registers, and the `global` phase
* applies immediately after it, so both are early enough.
*
* A build of Cornerstone3D that has no presets keeps its own behaviour, and
* this function reports the omission and does not throw.
*/
export default function initGpuSettingsPreset({ customizationService, appConfig }): void {
const configuredFinal = Boolean(appConfig?.lossyDownsampling?.final);
let appliedId = null;

const apply = () => {
const presetId = customizationService.getValue(CUSTOMIZATION_ID) ?? null;

if (presetId === appliedId) {
return;
}

const { setGpuSettingsPreset, resetGpuSettingsPreset, setLossyDownsampling } = cornerstone;

if (!presetId) {
// A preset that changes to null returns to the config and to the
// Cornerstone3D default preset.
resetGpuSettingsPreset?.();
setLossyDownsampling?.({ final: configuredFinal });
appliedId = null;
return;
}

if (typeof setGpuSettingsPreset !== 'function') {
console.warn(
`${CUSTOMIZATION_ID} states "${presetId}", and this build of ` +
'@cornerstonejs/core has no GPU settings presets. The viewer keeps ' +
'the behaviour of that build.'
);
appliedId = presetId;
return;
}

try {
setGpuSettingsPreset(presetId);
setLossyDownsampling?.({ final: true });
appliedId = presetId;
} catch (error) {
console.warn(`${CUSTOMIZATION_ID} states "${presetId}", which is not a preset.`, error);
}
};

apply();

customizationService.subscribe(customizationService.EVENTS.GLOBAL_CUSTOMIZATION_MODIFIED, apply);
customizationService.subscribe(customizationService.EVENTS.MODE_CUSTOMIZATION_MODIFIED, apply);
}
3 changes: 3 additions & 0 deletions platform/app/public/config/customization.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ window.config = {
extensions: [],
modes: ['@ohif/mode-test'],
showStudyList: true,
// Final downsampling reduces a volume texture to fit the GPU settings preset.
// config/default.js keeps it off.
lossyDownsampling: { final: true },
// below flag is for performance reasons, but it might not work for all servers
maxNumberOfWebWorkers: 3,
showWarningMessageForCrossOrigin: false,
Expand Down
8 changes: 8 additions & 0 deletions platform/app/public/config/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ window.config = {
showLoadingIndicator: true,
experimentalStudyBrowserSort: false,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling is off here. To turn it on, uncomment the line below.
// Cornerstone3D defaults: final false, interactive true, interleavedLoading true.
// `final` reduces a volume texture to fit the GPU settings preset. Select the
// preset with the `cornerstone.gpuSettingsPreset` customization: auto, low-tablet,
// low, medium, high, high-texture-4096. These options are not fully safe on every
// device: a texture that is too large can lose the WebGL context, and then the
// user must reload. See configurationFiles.md and specificCustomizations.md.
// lossyDownsampling: { final: true, interactive: true, interleavedLoading: true },
groupEnabledModesFirst: true,
allowMultiSelectExport: false,
maxNumRequests: {
Expand Down
5 changes: 5 additions & 0 deletions platform/app/public/config/dev.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ window.config = {
showLoadingIndicator: true,
experimentalStudyBrowserSort: false,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling for the tests and the deploy previews. `final` reduces
// a volume texture to fit the GPU settings preset (Cornerstone3D default
// preset, or `cornerstone.gpuSettingsPreset`). config/default.js keeps final
// downsampling off.
lossyDownsampling: { final: true },
groupEnabledModesFirst: true,
allowMultiSelectExport: false,
maxNumRequests: {
Expand Down
8 changes: 8 additions & 0 deletions platform/app/public/config/docker-nginx-dcm4chee-keycloak.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ window.config = {
showCPUFallbackMessage: true,
showLoadingIndicator: true,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling is off here. To turn it on, uncomment the line below.
// Cornerstone3D defaults: final false, interactive true, interleavedLoading true.
// `final` reduces a volume texture to fit the GPU settings preset. Select the
// preset with the `cornerstone.gpuSettingsPreset` customization: auto, low-tablet,
// low, medium, high, high-texture-4096. These options are not fully safe on every
// device: a texture that is too large can lose the WebGL context, and then the
// user must reload. See configurationFiles.md and specificCustomizations.md.
// lossyDownsampling: { final: true, interactive: true, interleavedLoading: true },
defaultDataSourceName: 'dicomweb',
dataSources: [
{
Expand Down
8 changes: 8 additions & 0 deletions platform/app/public/config/docker-nginx-dcm4chee.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ window.config = {
showCPUFallbackMessage: true,
showLoadingIndicator: true,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling is off here. To turn it on, uncomment the line below.
// Cornerstone3D defaults: final false, interactive true, interleavedLoading true.
// `final` reduces a volume texture to fit the GPU settings preset. Select the
// preset with the `cornerstone.gpuSettingsPreset` customization: auto, low-tablet,
// low, medium, high, high-texture-4096. These options are not fully safe on every
// device: a texture that is too large can lose the WebGL context, and then the
// user must reload. See configurationFiles.md and specificCustomizations.md.
// lossyDownsampling: { final: true, interactive: true, interleavedLoading: true },
defaultDataSourceName: 'dicomweb',
dataSources: [
{
Expand Down
8 changes: 8 additions & 0 deletions platform/app/public/config/docker-nginx-orthanc-keycloak.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ window.config = {
showCPUFallbackMessage: true,
showLoadingIndicator: true,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling is off here. To turn it on, uncomment the line below.
// Cornerstone3D defaults: final false, interactive true, interleavedLoading true.
// `final` reduces a volume texture to fit the GPU settings preset. Select the
// preset with the `cornerstone.gpuSettingsPreset` customization: auto, low-tablet,
// low, medium, high, high-texture-4096. These options are not fully safe on every
// device: a texture that is too large can lose the WebGL context, and then the
// user must reload. See configurationFiles.md and specificCustomizations.md.
// lossyDownsampling: { final: true, interactive: true, interleavedLoading: true },
groupEnabledModesFirst: true,
maxNumRequests: {
interaction: 100,
Expand Down
8 changes: 8 additions & 0 deletions platform/app/public/config/docker-nginx-orthanc.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ window.config = {
showLoadingIndicator: true,
experimentalStudyBrowserSort: false,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling is off here. To turn it on, uncomment the line below.
// Cornerstone3D defaults: final false, interactive true, interleavedLoading true.
// `final` reduces a volume texture to fit the GPU settings preset. Select the
// preset with the `cornerstone.gpuSettingsPreset` customization: auto, low-tablet,
// low, medium, high, high-texture-4096. These options are not fully safe on every
// device: a texture that is too large can lose the WebGL context, and then the
// user must reload. See configurationFiles.md and specificCustomizations.md.
// lossyDownsampling: { final: true, interactive: true, interleavedLoading: true },
studyPrefetcher: {
enabled: true,
displaySetsCount: 2,
Expand Down
5 changes: 5 additions & 0 deletions platform/app/public/config/e2e.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ window.config = {
showWarningMessageForCrossOrigin: false,
showCPUFallbackMessage: false,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling for the tests and the deploy previews. `final` reduces
// a volume texture to fit the GPU settings preset (Cornerstone3D default
// preset, or `cornerstone.gpuSettingsPreset`). config/default.js keeps final
// downsampling off.
lossyDownsampling: { final: true },
// filterQueryParam: false,

// Add some customizations to the default e2e datasource
Expand Down
5 changes: 5 additions & 0 deletions platform/app/public/config/netlify.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ window.config = {
showLoadingIndicator: true,
experimentalStudyBrowserSort: false,
strictZSpacingForVolumeViewport: true,
// Lossy downsampling for the tests and the deploy previews. `final` reduces
// a volume texture to fit the GPU settings preset (Cornerstone3D default
// preset, or `cornerstone.gpuSettingsPreset`). config/default.js keeps final
// downsampling off.
lossyDownsampling: { final: true },
groupEnabledModesFirst: true,
allowMultiSelectExport: false,
maxNumRequests: {
Expand Down
27 changes: 27 additions & 0 deletions platform/app/public/customizations/gpu/high-texture-4096.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// GPU settings preset: high-texture-4096, a control that fits no real device
//
// A texture edge of 4096 voxels and 32 GB of texture memory. No device is
// tested to render an edge above 2048. Some devices report a larger
// MAX_3D_TEXTURE_SIZE, but a reported size is not a reliable limit, so a
// deployment must not select this preset in production. Cornerstone3D marks
// the preset `internal`.
//
// The preset is the control of the demonstration. A series of up to 4096
// images renders with no reduction here, and the same series reduces under
// `gpu/medium`. The pair shows that the reduction comes from the limit and
// not from a defect. A real device can fail to allocate a texture of this
// edge, and that failure is the expected result on hardware.
//
// A preset applies only with final downsampling on, and a preset in this
// customization turns final downsampling on, also in a locked-down config.
// `?customization=` needs `customizationUrlPrefixes`, and config/default.js has
// none: there, set the preset through `customizationService` in the config.
// Nothing probes the device: a preset is a set of values, so a real device may
// hold more or less than the preset states.
//
// Load it with `?customization=gpu/high-texture-4096`.
{
"bootstrap": {
"cornerstone.gpuSettingsPreset": "high-texture-4096"
}
}
Loading
Loading