Skip to content

Texture compression unaligned#4676

Open
castano wants to merge 6 commits into
gpuweb:mainfrom
castano:texture-compression-unaligned
Open

Texture compression unaligned#4676
castano wants to merge 6 commits into
gpuweb:mainfrom
castano:texture-compression-unaligned

Conversation

@castano

@castano castano commented Jun 25, 2026

Copy link
Copy Markdown

Issue: #2006

Add tests to support the proposed 'texture-compression-unaligned' feature. gpuweb/gpuweb#6312


Requirements for PR author:

  • All missing test coverage is tracked with "TODO" or .unimplemented().
  • New helpers are /** documented */ and new helper files are found in helper_index.txt.
  • Test behaves as expected in a WebGPU implementation. (If not passing, explain above.)
  • Test have be tested with compatibility mode validation enabled and behave as expected. (If not passing, explain above.)

Requirements for reviewer sign-off:

  • Tests are properly located.
  • Test descriptions are accurate and complete.
  • Tests provide complete coverage (including validation control cases). Missing coverage MUST be covered by TODOs.
  • Tests avoid over-parameterization (see case count report).

When landing this PR, be sure to make any necessary issue status updates.

@github-actions

github-actions Bot commented Jun 26, 2026

Copy link
Copy Markdown

Waiting for build job (at 520249e)...

@Kangz Kangz requested a review from kainino0x June 26, 2026 11:42
usage: GPUTextureUsage.TEXTURE_BINDING,
};

// With 'texture-compression-unaligned', mip level 0 is no longer required to be a multiple of

@Kangz Kangz Jun 26, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried this locally and the test fails somehow then 'texture-compression-unaligned' is available. I think we should have the test parametrized on requesting the feature (if present) vs not.

I tested on macOS with this WIP Dawn patch using dawn.node to run the CTS.

Here's the text of one failure:

webgpu:api,validation,createTexture:texture_size,3d_texture,compressed_format:format="bc1-rgba-unorm" - fail:
  - (in subcase: sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
        at AllFeaturesMaxLimitsGPUTest.eventualAsyncExpectation (/Users/cwallez/dev/cts/out-node/common/framework/fixture.js:217:28)
        at AllFeaturesMaxLimitsGPUTest.expectValidationError (/Users/cwallez/dev/cts/out-node/webgpu/gpu_test.js:839:18)
        at RunCaseSpecific.fn (/Users/cwallez/dev/cts/out-node/webgpu/api/validation/createTexture.spec.js:839:7)
  - (in subcase: sizeVariant=[{"mult":1,"add":-1},{"mult":0,"add":1},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":1,"add":-4},{"mult":0,"add":1},{"mult":0,"add":1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
        at AllFeaturesMaxLimitsGPUTest.eventualAsyncExpectation (/Users/cwallez/dev/cts/out-node/common/framework/fixture.js:217:28)
        at AllFeaturesMaxLimitsGPUTest.expectValidationError (/Users/cwallez/dev/cts/out-node/webgpu/gpu_test.js:839:18)
        at RunCaseSpecific.fn (/Users/cwallez/dev/cts/out-node/webgpu/api/validation/createTexture.spec.js:839:7)
  - (in subcase: sizeVariant=[{"mult":1,"add":-4},{"mult":0,"add":1},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":1,"add":-4},{"mult":0,"add":4},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":1},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":1,"add":0},{"mult":0,"add":4},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":1,"add":1},{"mult":0,"add":1},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":1,"add":4},{"mult":0,"add":1},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":1,"add":4},{"mult":0,"add":4},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-1},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-4},{"mult":0,"add":1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":-4},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":1,"add":-4},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":0},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":1,"add":0},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":1},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":1,"add":4},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":1,"add":4},{"mult":0,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":-1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":1},{"mult":1,"add":-1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":1},{"mult":1,"add":-1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":4},{"mult":1,"add":-1}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":4},{"mult":1,"add":-1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":4},{"mult":1,"add":-1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":0}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":1},{"mult":1,"add":0}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":1},{"mult":1,"add":0}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":4},{"mult":1,"add":0}]) VALIDATION FAILED: Validation succeeded unexpectedly.
      at (elided: only 2 shown)
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":4},{"mult":1,"add":0}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":4},{"mult":1,"add":0}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":1},{"mult":1,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":1},{"mult":1,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":1},{"mult":0,"add":4},{"mult":1,"add":1}]) INFO: subcase ran
  - (in subcase: sizeVariant=[{"mult":0,"add":4},{"mult":0,"add":4},{"mult":1,"add":1}]) INFO: subcase ran

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for testing this!

I think the fix is simply the same I used for the texture_size,2d_texture,compressed_format and texture_size,default_value_and_smallest_size,compressed_format tests, to change the expected result based on the presence of the extension. I'll apply the same fix to texture_size,3d_texture,compressed_format.

These tests run with AllFeaturesMaxLimitsGPUTest which always enables the unaligned feature (if available). That relaxes the constrain and changes the expected result of the tests.

This is why I added a dedicated test createTexture,unaligned_size that tests texture creation with texture-compression-unaligned enabled and disabled.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fix is checked in. Let me know if you run into any other issues!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants