Skip to content

Commit f036c5c

Browse files
committedJul 25, 2017
Updates to KTX and tests
1 parent 5ddf222 commit f036c5c

File tree

3 files changed

+95
-28
lines changed

3 files changed

+95
-28
lines changed
 

‎Source/Core/loadKTX.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,6 @@ define([
189189
if (glFormat !== 0) {
190190
throw new RuntimeError('glFormat must be zero when the texture is compressed.');
191191
}
192-
if (numberOfMipmapLevels === 0) {
193-
throw new RuntimeError('Generating mipmaps for a compressed texture is unsupported.');
194-
}
195192
} else if (glBaseInternalFormat !== glFormat) {
196193
throw new RuntimeError('The base internal format must be the same as the format for uncompressed textures.');
197194
}
@@ -208,9 +205,11 @@ define([
208205
}
209206

210207
// Only use the level 0 mipmap
211-
if (PixelFormat.isCompressedFormat(glInternalFormat) && numberOfMipmapLevels > 1) {
212-
var levelSize = PixelFormat.compressedTextureSizeInBytes(glInternalFormat, pixelWidth, pixelHeight);
213-
texture = texture.slice(0, levelSize);
208+
if (numberOfMipmapLevels > 1) {
209+
var levelSize = PixelFormat.isCompressedFormat(glInternalFormat) ?
210+
PixelFormat.compressedTextureSizeInBytes(glInternalFormat, pixelWidth, pixelHeight) :
211+
PixelFormat.textureSizeInBytes(glInternalFormat, pixelWidth, pixelHeight);
212+
texture = new Uint8Array(texture.buffer, texture.byteOffset, levelSize);
214213
}
215214

216215
return new CompressedTextureBuffer(glInternalFormat, pixelWidth, pixelHeight, texture);

‎Specs/Core/loadCRNSpec.js

+32-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ defineSuite([
1313
'use strict';
1414

1515
var validCompressed = new Uint8Array([72, 120, 0, 74, 227, 123, 0, 0, 0, 138, 92, 167, 0, 4, 0, 4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 22, 0, 1, 0, 0, 96, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 108, 0, 0, 0, 137, 0, 10, 96, 0, 0, 0, 0, 0, 0, 16, 4, 9, 130, 0, 0, 0, 0, 0, 0, 109, 4, 0, 0, 198, 96, 128, 0, 0, 0, 0, 0, 26, 80, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 128, 1, 152, 0, 0, 0, 0, 0, 0, 4, 0]);
16+
var validCompressedMipmap = new Uint8Array([72, 120, 0, 82, 183, 141, 0, 0, 0, 148, 151, 24, 0, 4, 0, 4, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 22, 0, 1, 0, 0, 104, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 116, 0, 0, 0, 145, 0, 0, 0, 146, 0, 0, 0, 147, 0, 130, 97, 0, 0, 0, 0, 0, 4, 35, 37, 0, 3, 48, 0, 0, 0, 0, 0, 0, 8, 200, 0, 198, 96, 128, 0, 0, 0, 0, 0, 26, 80, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 128, 1, 152, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0]);
1617
var fakeXHR;
1718

1819
beforeEach(function() {
@@ -119,7 +120,7 @@ defineSuite([
119120
expect(rejectedError.response).toEqual(error);
120121
});
121122

122-
it('returns a promise that resolves to an compressed texture when the request loads', function() {
123+
it('returns a promise that resolves to a compressed texture when the request loads', function() {
123124
var testUrl = 'http://example.invalid/testuri';
124125
var promise = loadCRN(testUrl);
125126

@@ -149,6 +150,36 @@ defineSuite([
149150
});
150151
});
151152

153+
it('returns a promise that resolves to a compressed texture containing the first mip level of the original texture', function() {
154+
var testUrl = 'http://example.invalid/testuri';
155+
var promise = loadCRN(testUrl);
156+
157+
expect(promise).toBeDefined();
158+
159+
var resolvedValue;
160+
var rejectedError;
161+
var newPromise = promise.then(function(value) {
162+
resolvedValue = value;
163+
}, function(error) {
164+
rejectedError = error;
165+
});
166+
167+
expect(resolvedValue).toBeUndefined();
168+
expect(rejectedError).toBeUndefined();
169+
170+
var response = validCompressedMipmap.buffer;
171+
fakeXHR.simulateLoad(response);
172+
173+
return newPromise.then(function() {
174+
expect(resolvedValue).toBeDefined();
175+
expect(resolvedValue.width).toEqual(4);
176+
expect(resolvedValue.height).toEqual(4);
177+
expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true);
178+
expect(resolvedValue.bufferView).toBeDefined();
179+
expect(rejectedError).toBeUndefined();
180+
});
181+
});
182+
152183
it('returns undefined if the request is throttled', function() {
153184
var oldMaximumRequests = RequestScheduler.maximumRequests;
154185
RequestScheduler.maximumRequests = 0;

‎Specs/Core/loadKTXSpec.js

+58-21
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ defineSuite([
1515
'use strict';
1616

1717
var validCompressed = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 241, 131, 0, 0, 8, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 224, 7, 224, 7, 0, 0, 0, 0]);
18+
var validCompressedMipmap = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 100, 141, 0, 0, 7, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 0, 19, 0, 0, 0, 67, 82, 78, 76, 73, 66, 95, 70, 79, 85, 82, 67, 67, 0, 69, 84, 67, 49, 0, 0, 23, 0, 0, 0, 75, 84, 88, 111, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 0, 83, 61, 114, 44, 84, 61, 100, 0, 0, 8, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 0, 8, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 0, 8, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 0]);
1819
var validUncompressed = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 1, 20, 0, 0, 1, 0, 0, 0, 8, 25, 0, 0, 88, 128, 0, 0, 8, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 27, 0, 0, 0, 75, 84, 88, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 0, 83, 61, 114, 44, 84, 61, 100, 44, 82, 61, 105, 0, 0, 64, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255]);
20+
var validUncompressedMipmap = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 1, 20, 0, 0, 1, 0, 0, 0, 7, 25, 0, 0, 81, 128, 0, 0, 7, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 0, 19, 0, 0, 0, 67, 82, 78, 76, 73, 66, 95, 70, 79, 85, 82, 67, 67, 0, 82, 71, 66, 120, 0, 0, 23, 0, 0, 0, 75, 84, 88, 111, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 0, 83, 61, 114, 44, 84, 61, 100, 0, 0, 48, 0, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 12, 0, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 3, 0, 0, 0, 255, 0, 0, 0]);
1921

2022
var fakeXHR;
2123

@@ -150,7 +152,34 @@ defineSuite([
150152
expect(rejectedError).toBeUndefined();
151153
});
152154

153-
it('returns a promise that resolves to an compressed texture when the request loads', function() {
155+
it('returns a promise that resolves to an uncompressed texture containing the first mip level of the original texture', function() {
156+
var testUrl = 'http://example.invalid/testuri';
157+
var promise = loadKTX(testUrl);
158+
159+
expect(promise).toBeDefined();
160+
161+
var resolvedValue;
162+
var rejectedError;
163+
promise.then(function(value) {
164+
resolvedValue = value;
165+
}, function(error) {
166+
rejectedError = error;
167+
});
168+
169+
expect(resolvedValue).toBeUndefined();
170+
expect(rejectedError).toBeUndefined();
171+
172+
var response = validUncompressedMipmap.buffer;
173+
fakeXHR.simulateLoad(response);
174+
expect(resolvedValue).toBeDefined();
175+
expect(resolvedValue.width).toEqual(4);
176+
expect(resolvedValue.height).toEqual(4);
177+
expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(false);
178+
expect(resolvedValue.bufferView).toBeDefined();
179+
expect(rejectedError).toBeUndefined();
180+
});
181+
182+
it('returns a promise that resolves to a compressed texture when the request loads', function() {
154183
var testUrl = 'http://example.invalid/testuri';
155184
var promise = loadKTX(testUrl);
156185

@@ -177,6 +206,34 @@ defineSuite([
177206
expect(rejectedError).toBeUndefined();
178207
});
179208

209+
it('returns a promise that resolves to a compressed texture containing the first mip level of the original texture', function() {
210+
var testUrl = 'http://example.invalid/testuri';
211+
var promise = loadKTX(testUrl);
212+
213+
expect(promise).toBeDefined();
214+
215+
var resolvedValue;
216+
var rejectedError;
217+
promise.then(function(value) {
218+
resolvedValue = value;
219+
}, function(error) {
220+
rejectedError = error;
221+
});
222+
223+
expect(resolvedValue).toBeUndefined();
224+
expect(rejectedError).toBeUndefined();
225+
226+
var response = validCompressedMipmap.buffer;
227+
fakeXHR.simulateLoad(response);
228+
expect(resolvedValue).toBeDefined();
229+
expect(resolvedValue.width).toEqual(4);
230+
expect(resolvedValue.height).toEqual(4);
231+
expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true);
232+
expect(resolvedValue.bufferView).toBeDefined();
233+
expect(rejectedError).toBeUndefined();
234+
});
235+
236+
180237
it('cannot parse invalid KTX buffer', function() {
181238
var invalidKTX = new Uint8Array(validCompressed);
182239
invalidKTX[0] = 0;
@@ -276,26 +333,6 @@ defineSuite([
276333
expect(rejectedError.message).toEqual('The type size for compressed textures must be 1.');
277334
});
278335

279-
it('cannot parse KTX buffer with compressed texture and needs to generate mipmaps', function() {
280-
var reinterprestBuffer = new Uint32Array(validCompressed.buffer);
281-
var invalidKTX = new Uint32Array(reinterprestBuffer);
282-
invalidKTX[14] = 0;
283-
284-
var promise = loadKTX(invalidKTX.buffer);
285-
286-
var resolvedValue;
287-
var rejectedError;
288-
promise.then(function(value) {
289-
resolvedValue = value;
290-
}, function(error) {
291-
rejectedError = error;
292-
});
293-
294-
expect(resolvedValue).toBeUndefined();
295-
expect(rejectedError instanceof RuntimeError).toEqual(true);
296-
expect(rejectedError.message).toEqual('Generating mipmaps for a compressed texture is unsupported.');
297-
});
298-
299336
it('cannot parse KTX buffer with uncompressed texture and base format is not the same as format', function() {
300337
var reinterprestBuffer = new Uint32Array(validUncompressed.buffer);
301338
var invalidKTX = new Uint32Array(reinterprestBuffer);

0 commit comments

Comments
 (0)
Please sign in to comment.