|
@@ -64,6 +64,7 @@ class DxFrame {
|
|
public var commandList : CommandList;
|
|
public var commandList : CommandList;
|
|
public var fenceValue : Int64;
|
|
public var fenceValue : Int64;
|
|
public var toRelease : Array<Resource> = [];
|
|
public var toRelease : Array<Resource> = [];
|
|
|
|
+ public var tmpBufToRelease : Array<Texture> = [];
|
|
public var shaderResourceViews : ManagedHeap;
|
|
public var shaderResourceViews : ManagedHeap;
|
|
public var samplerViews : ManagedHeap;
|
|
public var samplerViews : ManagedHeap;
|
|
public var shaderResourceCache : ManagedHeapArray;
|
|
public var shaderResourceCache : ManagedHeapArray;
|
|
@@ -404,6 +405,12 @@ class DX12Driver extends h3d.impl.Driver {
|
|
frame.commandList.reset(frame.allocator, null);
|
|
frame.commandList.reset(frame.allocator, null);
|
|
while( frame.toRelease.length > 0 )
|
|
while( frame.toRelease.length > 0 )
|
|
frame.toRelease.pop().release();
|
|
frame.toRelease.pop().release();
|
|
|
|
+ while( frame.tmpBufToRelease.length > 0 ) {
|
|
|
|
+ var t = frame.tmpBufToRelease.pop();
|
|
|
|
+ if ( t.tmpBuf != null )
|
|
|
|
+ t.tmpBuf.release();
|
|
|
|
+ t.tmpBuf = null;
|
|
|
|
+ }
|
|
beginQueries();
|
|
beginQueries();
|
|
|
|
|
|
var used = frame.usedBuffers;
|
|
var used = frame.usedBuffers;
|
|
@@ -456,13 +463,13 @@ class DX12Driver extends h3d.impl.Driver {
|
|
if( count == 0 ) count = 1;
|
|
if( count == 0 ) count = 1;
|
|
for( i in 0...count ) {
|
|
for( i in 0...count ) {
|
|
var tex = currentRenderTargets[i];
|
|
var tex = currentRenderTargets[i];
|
|
- if( tex != null && tex.t.setClearColor(color) ) {
|
|
|
|
|
|
+ if( tex != null && tex.t.t.setClearColor(color) ) {
|
|
// update texture to use another clear value
|
|
// update texture to use another clear value
|
|
var prev = tex.t;
|
|
var prev = tex.t;
|
|
tex.t = allocTexture(tex);
|
|
tex.t = allocTexture(tex);
|
|
- @:privateAccess tex.t.clearColorChanges = prev.clearColorChanges;
|
|
|
|
- frame.toRelease.push(prev.res);
|
|
|
|
- Driver.createRenderTargetView(tex.t.res, null, tmp.renderTargets[i]);
|
|
|
|
|
|
+ @:privateAccess tex.t.t.clearColorChanges = prev.t.clearColorChanges;
|
|
|
|
+ frame.toRelease.push(prev.t.res);
|
|
|
|
+ Driver.createRenderTargetView(tex.t.t.res, null, tmp.renderTargets[i]);
|
|
}
|
|
}
|
|
frame.commandList.clearRenderTargetView(tmp.renderTargets[i], clear);
|
|
frame.commandList.clearRenderTargetView(tmp.renderTargets[i], clear);
|
|
}
|
|
}
|
|
@@ -599,7 +606,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
throw "Depth size mismatch";
|
|
throw "Depth size mismatch";
|
|
}
|
|
}
|
|
var depthView = depthStenciViews.alloc(1);
|
|
var depthView = depthStenciViews.alloc(1);
|
|
- Driver.createDepthStencilView(tex == null || tex.depthBuffer == defaultDepth ? frame.depthBuffer : @:privateAccess tex.depthBuffer.t.res, null, depthView);
|
|
|
|
|
|
+ Driver.createDepthStencilView(tex == null || tex.depthBuffer == defaultDepth ? frame.depthBuffer : @:privateAccess tex.depthBuffer.t.t.res, null, depthView);
|
|
var depths = tmp.depthStencils;
|
|
var depths = tmp.depthStencils;
|
|
depths[0] = depthView;
|
|
depths[0] = depthView;
|
|
depthEnabled = true;
|
|
depthEnabled = true;
|
|
@@ -628,7 +635,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
|
|
|
|
if( tex != null ) {
|
|
if( tex != null ) {
|
|
if( tex.t == null ) tex.alloc();
|
|
if( tex.t == null ) tex.alloc();
|
|
- transition(tex.t, RENDER_TARGET);
|
|
|
|
|
|
+ transition(tex.t.t, RENDER_TARGET);
|
|
}
|
|
}
|
|
|
|
|
|
var texView = renderTargetViews.alloc(1);
|
|
var texView = renderTargetViews.alloc(1);
|
|
@@ -636,7 +643,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
var desc = null;
|
|
var desc = null;
|
|
if( layer != 0 || mipLevel != 0 || isArr ) {
|
|
if( layer != 0 || mipLevel != 0 || isArr ) {
|
|
desc = tmp.rtvDesc;
|
|
desc = tmp.rtvDesc;
|
|
- desc.format = tex.t.format;
|
|
|
|
|
|
+ desc.format = tex.t.t.format;
|
|
if( isArr ) {
|
|
if( isArr ) {
|
|
desc.viewDimension = TEXTURE2DARRAY;
|
|
desc.viewDimension = TEXTURE2DARRAY;
|
|
desc.mipSlice = mipLevel;
|
|
desc.mipSlice = mipLevel;
|
|
@@ -649,7 +656,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
desc.planeSlice = 0;
|
|
desc.planeSlice = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- Driver.createRenderTargetView(tex == null ? frame.backBuffer.res : tex.t.res, desc, texView);
|
|
|
|
|
|
+ Driver.createRenderTargetView(tex == null ? frame.backBuffer.res : tex.t.t.res, desc, texView);
|
|
tmp.renderTargets[0] = texView;
|
|
tmp.renderTargets[0] = texView;
|
|
frame.commandList.omSetRenderTargets(1, tmp.renderTargets, true, getDepthView(tex));
|
|
frame.commandList.omSetRenderTargets(1, tmp.renderTargets, true, getDepthView(tex));
|
|
|
|
|
|
@@ -674,11 +681,11 @@ class DX12Driver extends h3d.impl.Driver {
|
|
var bits = 0;
|
|
var bits = 0;
|
|
for( i => t in textures ) {
|
|
for( i => t in textures ) {
|
|
var view = texViews.offset(renderTargetViews.stride * i);
|
|
var view = texViews.offset(renderTargetViews.stride * i);
|
|
- Driver.createRenderTargetView(t.t.res, null, view);
|
|
|
|
|
|
+ Driver.createRenderTargetView(t.t.t.res, null, view);
|
|
tmp.renderTargets[i] = view;
|
|
tmp.renderTargets[i] = view;
|
|
currentRenderTargets[i] = t;
|
|
currentRenderTargets[i] = t;
|
|
bits |= getRTBits(t) << (i << 2);
|
|
bits |= getRTBits(t) << (i << 2);
|
|
- transition(t.t, RENDER_TARGET);
|
|
|
|
|
|
+ transition(t.t.t, RENDER_TARGET);
|
|
}
|
|
}
|
|
|
|
|
|
frame.commandList.omSetRenderTargets(textures.length, tmp.renderTargets, true, getDepthView(textures[0]));
|
|
frame.commandList.omSetRenderTargets(textures.length, tmp.renderTargets, true, getDepthView(textures[0]));
|
|
@@ -742,7 +749,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
|
|
|
|
var totalSize : hl.BytesAccess<Int64> = new hl.Bytes(8);
|
|
var totalSize : hl.BytesAccess<Int64> = new hl.Bytes(8);
|
|
var src = new TextureCopyLocation();
|
|
var src = new TextureCopyLocation();
|
|
- src.res = tex.t.res;
|
|
|
|
|
|
+ src.res = tex.t.t.res;
|
|
src.subResourceIndex = mipLevel + layer * tex.mipLevels;
|
|
src.subResourceIndex = mipLevel + layer * tex.mipLevels;
|
|
var srcDesc = makeTextureDesc(tex);
|
|
var srcDesc = makeTextureDesc(tex);
|
|
|
|
|
|
@@ -769,7 +776,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
box.bottom = pixels.height;
|
|
box.bottom = pixels.height;
|
|
box.back = 1;
|
|
box.back = 1;
|
|
|
|
|
|
- transition(tex.t, COPY_SOURCE);
|
|
|
|
|
|
+ transition(tex.t.t, COPY_SOURCE);
|
|
dst.res = tmpBuf;
|
|
dst.res = tmpBuf;
|
|
frame.commandList.copyTextureRegion(dst, 0, 0, 0, src, box);
|
|
frame.commandList.copyTextureRegion(dst, 0, 0, 0, src, box);
|
|
|
|
|
|
@@ -1199,7 +1206,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
|
|
|
|
var clear = null;
|
|
var clear = null;
|
|
if( isRT ) {
|
|
if( isRT ) {
|
|
- var color = t.t == null || t.t.color == null ? new h3d.Vector(0,0,0,0) : t.t.color; // reuse prev color
|
|
|
|
|
|
+ var color = t.t == null || t.t.t.color == null ? new h3d.Vector(0,0,0,0) : t.t.t.color; // reuse prev color
|
|
desc.flags.set(ALLOW_RENDER_TARGET);
|
|
desc.flags.set(ALLOW_RENDER_TARGET);
|
|
clear = tmp.clearValue;
|
|
clear = tmp.clearValue;
|
|
clear.format = desc.format;
|
|
clear.format = desc.format;
|
|
@@ -1216,7 +1223,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
t.lastFrame = frameCount;
|
|
t.lastFrame = frameCount;
|
|
t.flags.unset(WasCleared);
|
|
t.flags.unset(WasCleared);
|
|
|
|
|
|
- return td;
|
|
|
|
|
|
+ return { t : td, tmpBuf : null };
|
|
}
|
|
}
|
|
|
|
|
|
override function allocDepthBuffer(b:h3d.mat.Texture):Texture {
|
|
override function allocDepthBuffer(b:h3d.mat.Texture):Texture {
|
|
@@ -1238,16 +1245,16 @@ class DX12Driver extends h3d.impl.Driver {
|
|
tmp.clearValue.stencil= 0;
|
|
tmp.clearValue.stencil= 0;
|
|
td.state = DEPTH_WRITE;
|
|
td.state = DEPTH_WRITE;
|
|
td.res = Driver.createCommittedResource(tmp.heap, flags, desc, DEPTH_WRITE, tmp.clearValue);
|
|
td.res = Driver.createCommittedResource(tmp.heap, flags, desc, DEPTH_WRITE, tmp.clearValue);
|
|
- return td;
|
|
|
|
|
|
+ return { t : td, tmpBuf : null };
|
|
}
|
|
}
|
|
|
|
|
|
override function disposeTexture(t:h3d.mat.Texture) {
|
|
override function disposeTexture(t:h3d.mat.Texture) {
|
|
- disposeResource(t.t);
|
|
|
|
|
|
+ disposeResource(t.t.t);
|
|
t.t = null;
|
|
t.t = null;
|
|
}
|
|
}
|
|
|
|
|
|
override function disposeDepthBuffer(t:h3d.mat.Texture) {
|
|
override function disposeDepthBuffer(t:h3d.mat.Texture) {
|
|
- disposeResource(@:privateAccess t.t);
|
|
|
|
|
|
+ disposeResource(@:privateAccess t.t.t);
|
|
}
|
|
}
|
|
|
|
|
|
override function uploadTextureBitmap(t:h3d.mat.Texture, bmp:hxd.BitmapData, mipLevel:Int, side:Int) {
|
|
override function uploadTextureBitmap(t:h3d.mat.Texture, bmp:hxd.BitmapData, mipLevel:Int, side:Int) {
|
|
@@ -1261,20 +1268,17 @@ class DX12Driver extends h3d.impl.Driver {
|
|
pixels.setFlip(false);
|
|
pixels.setFlip(false);
|
|
if( mipLevel >= t.mipLevels ) throw "Mip level outside texture range : " + mipLevel + " (max = " + (t.mipLevels - 1) + ")";
|
|
if( mipLevel >= t.mipLevels ) throw "Mip level outside texture range : " + mipLevel + " (max = " + (t.mipLevels - 1) + ")";
|
|
|
|
|
|
- var desc = new ResourceDesc();
|
|
|
|
- var flags = new haxe.EnumFlags();
|
|
|
|
- desc.dimension = BUFFER;
|
|
|
|
- desc.width = pixels.width;
|
|
|
|
- desc.height = pixels.height;
|
|
|
|
- desc.depthOrArraySize = 1;
|
|
|
|
- desc.mipLevels = 1;
|
|
|
|
- desc.sampleDesc.count = 1;
|
|
|
|
- desc.format = t.t.format;
|
|
|
|
-
|
|
|
|
tmp.heap.type = UPLOAD;
|
|
tmp.heap.type = UPLOAD;
|
|
var subRes = mipLevel + side * t.mipLevels;
|
|
var subRes = mipLevel + side * t.mipLevels;
|
|
- var tmpSize = t.t.res.getRequiredIntermediateSize(subRes, 1).low;
|
|
|
|
- var tmpBuf = allocGPU(tmpSize, UPLOAD, GENERIC_READ);
|
|
|
|
|
|
+ var nbRes = t.mipLevels * t.layerCount;
|
|
|
|
+ if ( t.t.tmpBuf == null ) {
|
|
|
|
+ var tmpSize = t.t.t.res.getRequiredIntermediateSize(0, nbRes).low;
|
|
|
|
+ t.t.tmpBuf = allocGPU(tmpSize, UPLOAD, GENERIC_READ);
|
|
|
|
+ }
|
|
|
|
+ var previousSize : hl.BytesAccess<Int64> = new hl.Bytes(8);
|
|
|
|
+ Driver.getCopyableFootprints(makeTextureDesc(t), 0, subRes, 0, null, null, null, previousSize);
|
|
|
|
+ var offset = previousSize[0];
|
|
|
|
+ offset = offset < 0 ? 0 : offset;
|
|
|
|
|
|
var upd = new SubResourceData();
|
|
var upd = new SubResourceData();
|
|
var stride = @:privateAccess pixels.stride;
|
|
var stride = @:privateAccess pixels.stride;
|
|
@@ -1286,12 +1290,12 @@ class DX12Driver extends h3d.impl.Driver {
|
|
upd.rowPitch = stride;
|
|
upd.rowPitch = stride;
|
|
upd.slicePitch = pixels.dataSize;
|
|
upd.slicePitch = pixels.dataSize;
|
|
|
|
|
|
- transition(t.t, COPY_DEST);
|
|
|
|
- if( !Driver.updateSubResource(frame.commandList, t.t.res, tmpBuf, 0, subRes, 1, upd) )
|
|
|
|
|
|
+ transition(t.t.t, COPY_DEST);
|
|
|
|
+ if( !Driver.updateSubResource(frame.commandList, t.t.t.res, t.t.tmpBuf, offset, subRes, 1, upd) )
|
|
throw "Failed to update sub resource";
|
|
throw "Failed to update sub resource";
|
|
- transition(t.t, PIXEL_SHADER_RESOURCE);
|
|
|
|
|
|
+ transition(t.t.t, PIXEL_SHADER_RESOURCE);
|
|
|
|
|
|
- frame.toRelease.push(tmpBuf);
|
|
|
|
|
|
+ frame.tmpBufToRelease.push(t.t);
|
|
t.flags.set(WasCleared);
|
|
t.flags.set(WasCleared);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1306,17 +1310,17 @@ class DX12Driver extends h3d.impl.Driver {
|
|
if( from.t == null ) throw "assert";
|
|
if( from.t == null ) throw "assert";
|
|
if( to.t == null ) return false;
|
|
if( to.t == null ) return false;
|
|
}
|
|
}
|
|
- transition(from.t, COPY_SOURCE);
|
|
|
|
- transition(to.t, COPY_DEST);
|
|
|
|
|
|
+ transition(from.t.t, COPY_SOURCE);
|
|
|
|
+ transition(to.t.t, COPY_DEST);
|
|
var dst = new TextureCopyLocation();
|
|
var dst = new TextureCopyLocation();
|
|
var src = new TextureCopyLocation();
|
|
var src = new TextureCopyLocation();
|
|
- dst.res = to.t.res;
|
|
|
|
- src.res = from.t.res;
|
|
|
|
|
|
+ dst.res = to.t.t.res;
|
|
|
|
+ src.res = from.t.t.res;
|
|
frame.commandList.copyTextureRegion(dst, 0, 0, 0, src, null);
|
|
frame.commandList.copyTextureRegion(dst, 0, 0, 0, src, null);
|
|
to.flags.set(WasCleared);
|
|
to.flags.set(WasCleared);
|
|
for( t in currentRenderTargets )
|
|
for( t in currentRenderTargets )
|
|
if( t == to || t == from ) {
|
|
if( t == to || t == from ) {
|
|
- transition(t.t, RENDER_TARGET);
|
|
|
|
|
|
+ transition(t.t.t, RENDER_TARGET);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
return true;
|
|
@@ -1427,21 +1431,21 @@ class DX12Driver extends h3d.impl.Driver {
|
|
var tdesc : ShaderResourceViewDesc;
|
|
var tdesc : ShaderResourceViewDesc;
|
|
if( t.flags.has(Cube) ) {
|
|
if( t.flags.has(Cube) ) {
|
|
var desc = tmp.texCubeSRV;
|
|
var desc = tmp.texCubeSRV;
|
|
- desc.format = t.t.format;
|
|
|
|
|
|
+ desc.format = t.t.t.format;
|
|
tdesc = desc;
|
|
tdesc = desc;
|
|
} else if( t.flags.has(IsArray) ) {
|
|
} else if( t.flags.has(IsArray) ) {
|
|
var desc = tmp.tex2DArraySRV;
|
|
var desc = tmp.tex2DArraySRV;
|
|
- desc.format = t.t.format;
|
|
|
|
|
|
+ desc.format = t.t.t.format;
|
|
desc.arraySize = t.layerCount;
|
|
desc.arraySize = t.layerCount;
|
|
tdesc = desc;
|
|
tdesc = desc;
|
|
} else {
|
|
} else {
|
|
var desc = tmp.tex2DSRV;
|
|
var desc = tmp.tex2DSRV;
|
|
- desc.format = t.t.format;
|
|
|
|
|
|
+ desc.format = t.t.t.format;
|
|
tdesc = desc;
|
|
tdesc = desc;
|
|
}
|
|
}
|
|
t.lastFrame = frameCount;
|
|
t.lastFrame = frameCount;
|
|
- transition(t.t, shader.vertex ? NON_PIXEL_SHADER_RESOURCE : PIXEL_SHADER_RESOURCE);
|
|
|
|
- Driver.createShaderResourceView(t.t.res, tdesc, srv.offset(i * frame.shaderResourceViews.stride));
|
|
|
|
|
|
+ transition(t.t.t, shader.vertex ? NON_PIXEL_SHADER_RESOURCE : PIXEL_SHADER_RESOURCE);
|
|
|
|
+ Driver.createShaderResourceView(t.t.t.res, tdesc, srv.offset(i * frame.shaderResourceViews.stride));
|
|
|
|
|
|
var desc = tmp.samplerDesc;
|
|
var desc = tmp.samplerDesc;
|
|
desc.filter = switch( [t.filter, t.mipMap] ) {
|
|
desc.filter = switch( [t.filter, t.mipMap] ) {
|
|
@@ -1602,7 +1606,7 @@ class DX12Driver extends h3d.impl.Driver {
|
|
t.renderTargetWriteMask = colorMask;
|
|
t.renderTargetWriteMask = colorMask;
|
|
|
|
|
|
var t = currentRenderTargets[i];
|
|
var t = currentRenderTargets[i];
|
|
- p.rtvFormats[i] = t == null ? R8G8B8A8_UNORM : t.t.format;
|
|
|
|
|
|
+ p.rtvFormats[i] = t == null ? R8G8B8A8_UNORM : t.t.t.format;
|
|
}
|
|
}
|
|
p.dsvFormat = depthEnabled ? D24_UNORM_S8_UINT : UNKNOWN;
|
|
p.dsvFormat = depthEnabled ? D24_UNORM_S8_UINT : UNKNOWN;
|
|
|
|
|