Skip to content

Commit 4a73bf6

Browse files
committed
DDraw: Use GfxDynamicBufferCache
1 parent 5d2ce43 commit 4a73bf6

2 files changed

Lines changed: 36 additions & 57 deletions

File tree

src/gfx/render/GfxRenderCache.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,10 @@ class DynamicBufferEntry {
102102
this.buffer = device.createBuffer(byteCount, usage, GfxBufferFrequencyHint.Dynamic);
103103
}
104104

105-
public allocate(device: GfxDevice, data: Uint8Array): number {
106-
if (this.allocOffs + data.byteLength <= this.byteCount) {
105+
public allocate(byteCount: number): number {
106+
if (this.allocOffs + byteCount <= this.byteCount) {
107107
let byteOffset = this.allocOffs;
108-
device.uploadBufferData(this.buffer, byteOffset, data);
109-
this.allocOffs += align(data.byteLength, 4);
108+
this.allocOffs += align(byteCount, 4);
110109
this.age = 4;
111110
return byteOffset;
112111
} else {
@@ -139,25 +138,31 @@ export class GfxDynamicBufferCache {
139138
}
140139
}
141140

142-
public allocateData(usage: GfxBufferUsage, data: Uint8Array): GfxVertexBufferDescriptor {
141+
public allocateSize(usage: GfxBufferUsage, byteCount: number): GfxVertexBufferDescriptor {
143142
for (let i = 0; i < this.entry.length; i++) {
144143
const entry = this.entry[i];
145144
if (entry.usage !== usage)
146145
continue;
147-
const byteOffset = entry.allocate(this.device, data);
146+
const byteOffset = entry.allocate(byteCount);
148147
if (byteOffset >= 0)
149148
return { buffer: entry.buffer, byteOffset };
150149
}
151150

152151
// Round to the nearest 64.
153-
const newBufferSize = align(data.byteLength, 64);
152+
const newBufferSize = align(byteCount, 64);
154153
const entry = new DynamicBufferEntry(this.device, newBufferSize, usage);
155154
this.entry.push(entry);
156-
const byteOffset = entry.allocate(this.device, data);
155+
const byteOffset = entry.allocate(byteCount);
157156
assert(byteOffset === 0);
158157
return { buffer: entry.buffer, byteOffset };
159158
}
160159

160+
public allocateData(usage: GfxBufferUsage, data: Uint8Array): GfxVertexBufferDescriptor {
161+
const desc = this.allocateSize(usage, data.byteLength);
162+
this.device.uploadBufferData(desc.buffer, desc.byteOffset!, data);
163+
return desc;
164+
}
165+
161166
public destroy(): void {
162167
for (let i = 0; i < this.entry.length; i++)
163168
this.entry[i].destroy(this.device);

src/gx/DDraw.ts

Lines changed: 23 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,6 @@ abstract class TDDrawBase {
3232
protected useNBT = false;
3333
protected loadedVertexLayout: LoadedVertexLayout | null = null;
3434
protected inputLayout: GfxInputLayout | null = null;
35-
protected vertexBuffer: GfxBuffer | null = null;
36-
protected indexBuffer: GfxBuffer | null = null;
37-
protected vertexBufferDescriptors: GfxVertexBufferDescriptor[];
38-
protected indexBufferDescriptor: GfxIndexBufferDescriptor;
3935

4036
// Global information
4137
protected currentVertex: number;
@@ -51,9 +47,6 @@ abstract class TDDrawBase {
5147
for (let i = GX.Attr.POS; i <= GX.Attr.TEX7; i++) {
5248
this.vcd[i] = { type: GX.AttrType.NONE };
5349
}
54-
55-
this.vertexBufferDescriptors = [{ buffer: null! }];
56-
this.indexBufferDescriptor = { buffer: null! };
5750
}
5851

5952
public setVtxDesc(attr: GX.Attr, enabled: boolean): void {
@@ -163,10 +156,9 @@ abstract class TDDrawBase {
163156
}
164157

165158
export class TDDraw extends TDDrawBase {
166-
private recreateVertexBuffer: boolean = true;
167-
private recreateIndexBuffer: boolean = true;
168-
169159
private startIndex: number;
160+
private vertexBufferDescriptor: GfxVertexBufferDescriptor | null = null;
161+
private indexBufferDescriptor: GfxIndexBufferDescriptor | null = null;
170162

171163
constructor(name: string = '') {
172164
super(name);
@@ -180,7 +172,6 @@ export class TDDraw extends TDDrawBase {
180172
const newByteSizeAligned = align(newByteSize, this.vertexData.byteLength);
181173
const newBuffer = (this.vertexData.buffer as ArrayBuffer).transfer(newByteSizeAligned);
182174
this.vertexData = new DataView(newBuffer);
183-
this.recreateVertexBuffer = true;
184175
}
185176
}
186177

@@ -190,7 +181,6 @@ export class TDDraw extends TDDrawBase {
190181
const newSizeAligned = align(newSize, this.indexData.length);
191182
const newBuffer = (this.indexData.buffer as ArrayBuffer).transfer(newSizeAligned * 2);
192183
this.indexData = new Uint16Array(newBuffer);
193-
this.recreateIndexBuffer = true;
194184
}
195185
}
196186

@@ -204,30 +194,20 @@ export class TDDraw extends TDDrawBase {
204194
this.currentVertex = -1;
205195
this.currentIndex = 0;
206196
this.startIndex = 0;
207-
}
208197

209-
private flushDeviceObjects(device: GfxDevice): void {
210-
if (this.recreateVertexBuffer) {
211-
if (this.vertexBuffer !== null)
212-
device.destroyBuffer(this.vertexBuffer);
213-
this.vertexBuffer = device.createBuffer(this.vertexData.byteLength, GfxBufferUsage.Vertex, GfxBufferFrequencyHint.Dynamic);
214-
device.setResourceName(this.vertexBuffer, `TDDraw ${this.name}`);
215-
this.vertexBufferDescriptors[0].buffer = this.vertexBuffer;
216-
this.recreateVertexBuffer = false;
217-
}
198+
this.vertexBufferDescriptor = null;
199+
this.indexBufferDescriptor = null;
200+
}
218201

219-
if (this.recreateIndexBuffer) {
220-
if (this.indexBuffer !== null)
221-
device.destroyBuffer(this.indexBuffer);
222-
this.indexBuffer = device.createBuffer(this.indexData.byteLength, GfxBufferUsage.Index, GfxBufferFrequencyHint.Dynamic);
223-
device.setResourceName(this.indexBuffer, `TDDraw ${this.name} (IB)`);
224-
this.indexBufferDescriptor.buffer = this.indexBuffer;
225-
this.recreateIndexBuffer = false;
226-
}
202+
private flushDeviceObjects(cache: GfxRenderCache): void {
203+
if (this.vertexBufferDescriptor === null)
204+
this.vertexBufferDescriptor = cache.dynamicBufferCache.allocateSize(GfxBufferUsage.Vertex, this.vertexData.byteLength);
205+
if (this.indexBufferDescriptor === null)
206+
this.indexBufferDescriptor = cache.dynamicBufferCache.allocateSize(GfxBufferUsage.Index, this.indexData.byteLength);
227207
}
228208

229209
public setOnRenderInst(renderInst: GfxRenderInst): void {
230-
renderInst.setVertexInput(this.inputLayout, this.vertexBufferDescriptors, this.indexBufferDescriptor);
210+
renderInst.setVertexInput(this.inputLayout, [this.vertexBufferDescriptor], this.indexBufferDescriptor);
231211
renderInst.setDrawCount(this.currentIndex - this.startIndex, this.startIndex);
232212
}
233213

@@ -236,18 +216,18 @@ export class TDDraw extends TDDrawBase {
236216
}
237217

238218
public makeRenderInst(renderInstManager: GfxRenderInstManager): GfxRenderInst {
239-
this.flushDeviceObjects(renderInstManager.gfxRenderCache.device);
219+
this.flushDeviceObjects(renderInstManager.gfxRenderCache);
240220
const renderInst = renderInstManager.newRenderInst();
241221
this.setOnRenderInst(renderInst);
242222
this.startIndex = this.currentIndex;
243223
return renderInst;
244224
}
245225

246226
public endDraw(renderInstManager: GfxRenderInstManager): void {
247-
const device = renderInstManager.gfxRenderCache.device;
248-
this.flushDeviceObjects(device);
249-
device.uploadBufferData(this.vertexBuffer!, 0, new Uint8Array(this.vertexData.buffer));
250-
device.uploadBufferData(this.indexBuffer!, 0, new Uint8Array(this.indexData.buffer));
227+
const cache = renderInstManager.gfxRenderCache, device = cache.device;
228+
this.flushDeviceObjects(renderInstManager.gfxRenderCache);
229+
device.uploadBufferData(this.vertexBufferDescriptor!.buffer, 0, new Uint8Array(this.vertexData.buffer));
230+
device.uploadBufferData(this.indexBufferDescriptor!.buffer, 0, new Uint8Array(this.indexData.buffer));
251231
}
252232

253233
public endDrawAndMakeRenderInst(renderInstManager: GfxRenderInstManager): GfxRenderInst {
@@ -256,23 +236,17 @@ export class TDDraw extends TDDrawBase {
256236
}
257237

258238
public destroy(device: GfxDevice): void {
259-
if (this.indexBuffer !== null) {
260-
device.destroyBuffer(this.indexBuffer);
261-
this.indexBuffer = null;
262-
this.recreateIndexBuffer = true;
263-
}
264-
265-
if (this.vertexBuffer !== null) {
266-
device.destroyBuffer(this.vertexBuffer);
267-
this.vertexBuffer = null;
268-
this.recreateVertexBuffer = true;
269-
}
270239
}
271240
}
272241

273242
// Static Draw helper for places where we might want to make TDDraw into a buffer
274243
// that does not change very much.
275244
export class TSDraw extends TDDrawBase {
245+
private vertexBuffer: GfxBuffer | null = null;
246+
private indexBuffer: GfxBuffer | null = null;
247+
private vertexBufferDescriptors: GfxVertexBufferDescriptor[] = [];
248+
private indexBufferDescriptor: GfxIndexBufferDescriptor;
249+
276250
constructor(name: string = '') {
277251
super(name);
278252
this.vertexData = new DataView(new ArrayBuffer(0x400));
@@ -310,10 +284,10 @@ export class TSDraw extends TDDrawBase {
310284
const device = cache.device;
311285
this.vertexBuffer = device.createBuffer(this.vertexData.byteLength, GfxBufferUsage.Vertex, GfxBufferFrequencyHint.Static);
312286
device.setResourceName(this.vertexBuffer, `TSDraw ${this.name}`);
313-
this.vertexBufferDescriptors[0].buffer = this.vertexBuffer;
287+
this.vertexBufferDescriptors[0] = { buffer: this.vertexBuffer };
314288
this.indexBuffer = device.createBuffer(this.indexData.byteLength, GfxBufferUsage.Index, GfxBufferFrequencyHint.Static);
315289
device.setResourceName(this.indexBuffer, `TSDraw ${this.name} (IB)`);
316-
this.indexBufferDescriptor.buffer = this.indexBuffer;
290+
this.indexBufferDescriptor = { buffer: this.indexBuffer };
317291
}
318292

319293
public setOnRenderInst(renderInst: GfxRenderInst): void {

0 commit comments

Comments
 (0)