mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-18 21:13:02 +01:00
Fixed blit submit.
This commit is contained in:
@@ -22,11 +22,11 @@
|
||||
// known metal shader generation issues:
|
||||
03-raymarch: OSX10.11.3 nothing is visible ( depth/color swap in fragment output struct fixed this )
|
||||
14-shadowvolumes: in texture as stencil mode - columns/bunny are dark. in fs_shadowvolume_color_lighting SAMPLER2D(s_texStencil, 1) is
|
||||
converted to "texture2d<float> s_texStencil [[texture(0)]], sampler _mtlsmp_s_texStencil [[sampler(0)]]". Slot is 1 -> 0.
|
||||
converted to "texture2d<float> s_texStencil [[texture(0)]], sampler _mtlsmp_s_texStencil [[sampler(0)]]". Slot is 1 -> 0.
|
||||
15-shadowmaps-simple: shader compilation error
|
||||
16-shadowmaps: //problem with essl -> metal: SAMPLER2D(u_shadowMap0, 4); sampler index is lost. Shadowmap is set to slot 4, but
|
||||
metal shader uses sampler/texture slot 0. this could require changes outside of renderer_mtl?
|
||||
packFloatToRGBA needs highp. currently it uses half.
|
||||
packFloatToRGBA needs highp. currently it uses half.
|
||||
24-nbody: no generated compute shaders for metal
|
||||
27-terrain: shaderc generates invalid metal shader for vs_terrain_height_texture. vertex output: half4 gl_Position [[position]], should be float4
|
||||
31-rsm:
|
||||
@@ -36,18 +36,18 @@
|
||||
|
||||
Known issues(driver problems??):
|
||||
OSX mac mini(late 2014), OSX10.11.3 : nanovg-rendering: color writemask off causes problem...
|
||||
03-raymarch: OSX nothing is visible ( depth/color order should be swapped in fragment output struct)
|
||||
works fine with newer OSX
|
||||
03-raymarch: OSX nothing is visible ( depth/color order should be swapped in fragment output struct)
|
||||
works fine with newer OSX
|
||||
iPad mini 2, iOS 8.1.1: 21-deferred: scissor not working properly
|
||||
26-occlusion: query doesn't work with two rendercommandencoders
|
||||
Only on this device ( no problem on iPad Air 2 with iOS9.3.1)
|
||||
26-occlusion: query doesn't work with two rendercommandencoders
|
||||
Only on this device ( no problem on iPad Air 2 with iOS9.3.1)
|
||||
|
||||
TODOs:
|
||||
- framebufferMtl and TextureMtl resolve
|
||||
|
||||
- FrameBufferMtl::postReset recreate framebuffer???
|
||||
|
||||
renderpass load/resolve
|
||||
renderpass load/resolve
|
||||
- capture with msaa: 07-callback
|
||||
- implement fb discard. problematic with multiple views that has same fb...
|
||||
- msaa color/depth/stencil is not saved. could have problem when we switch back to msaa framebuffer
|
||||
@@ -975,6 +975,8 @@ namespace bgfx { namespace mtl
|
||||
m_occlusionQuery.invalidate(_handle);
|
||||
}
|
||||
|
||||
void submitBlit(BlitState& _bs, uint16_t _view);
|
||||
|
||||
void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE;
|
||||
|
||||
void blitSetup(TextVideoMemBlitter& _blitter) BX_OVERRIDE
|
||||
@@ -2974,6 +2976,87 @@ namespace bgfx { namespace mtl
|
||||
}
|
||||
}
|
||||
|
||||
void RendererContextMtl::submitBlit(BlitState& _bs, uint16_t _view)
|
||||
{
|
||||
if (0 != m_renderCommandEncoder)
|
||||
{
|
||||
m_renderCommandEncoder.endEncoding();
|
||||
m_renderCommandEncoder = 0;
|
||||
}
|
||||
|
||||
m_blitCommandEncoder = getBlitCommandEncoder();
|
||||
|
||||
while (_bs.hasItem(_view) )
|
||||
{
|
||||
const BlitItem& blit = _bs.advance();
|
||||
|
||||
const TextureMtl& src = m_textures[blit.m_src.idx];
|
||||
const TextureMtl& dst = m_textures[blit.m_dst.idx];
|
||||
|
||||
uint32_t srcWidth = bx::uint32_min(src.m_width, blit.m_srcX + blit.m_width) - blit.m_srcX;
|
||||
uint32_t srcHeight = bx::uint32_min(src.m_height, blit.m_srcY + blit.m_height) - blit.m_srcY;
|
||||
uint32_t srcDepth = bx::uint32_min(src.m_depth, blit.m_srcZ + blit.m_depth) - blit.m_srcZ;
|
||||
uint32_t dstWidth = bx::uint32_min(dst.m_width, blit.m_dstX + blit.m_width) - blit.m_dstX;
|
||||
uint32_t dstHeight = bx::uint32_min(dst.m_height, blit.m_dstY + blit.m_height) - blit.m_dstY;
|
||||
uint32_t dstDepth = bx::uint32_min(dst.m_depth, blit.m_dstZ + blit.m_depth) - blit.m_dstZ;
|
||||
uint32_t width = bx::uint32_min(srcWidth, dstWidth);
|
||||
uint32_t height = bx::uint32_min(srcHeight, dstHeight);
|
||||
uint32_t depth = bx::uint32_min(srcDepth, dstDepth);
|
||||
#if BX_PLATFORM_OSX
|
||||
bool readBack = !!(dst.m_flags & BGFX_TEXTURE_READ_BACK);
|
||||
#endif // BX_PLATFORM_OSX
|
||||
|
||||
if ( MTLTextureType3D == src.m_ptr.textureType())
|
||||
{
|
||||
m_blitCommandEncoder.copyFromTexture(
|
||||
src.m_ptr
|
||||
, 0
|
||||
, 0
|
||||
, MTLOriginMake(blit.m_srcX, blit.m_srcY, blit.m_srcZ)
|
||||
, MTLSizeMake(width, height, bx::uint32_imax(depth, 1))
|
||||
, dst.m_ptr
|
||||
, 0
|
||||
, 0
|
||||
, MTLOriginMake(blit.m_dstX, blit.m_dstY, blit.m_dstZ)
|
||||
);
|
||||
#if BX_PLATFORM_OSX
|
||||
if (m_macOS11Runtime
|
||||
&& readBack)
|
||||
{
|
||||
m_blitCommandEncoder.synchronizeResource(dst.m_ptr);
|
||||
}
|
||||
#endif // BX_PLATFORM_OSX
|
||||
}
|
||||
else
|
||||
{
|
||||
m_blitCommandEncoder.copyFromTexture(
|
||||
src.m_ptr
|
||||
, blit.m_srcZ
|
||||
, blit.m_srcMip
|
||||
, MTLOriginMake(blit.m_srcX, blit.m_srcY, 0)
|
||||
, MTLSizeMake(width, height, 1)
|
||||
, dst.m_ptr
|
||||
, blit.m_dstZ
|
||||
, blit.m_dstMip
|
||||
, MTLOriginMake(blit.m_dstX, blit.m_dstY, 0)
|
||||
);
|
||||
#if BX_PLATFORM_OSX
|
||||
if (m_macOS11Runtime
|
||||
&& readBack)
|
||||
{
|
||||
m_blitCommandEncoder.synchronizeTexture(dst.m_ptr, 0, blit.m_dstMip);
|
||||
}
|
||||
#endif // BX_PLATFORM_OSX
|
||||
}
|
||||
}
|
||||
|
||||
if (0 != m_blitCommandEncoder)
|
||||
{
|
||||
m_blitCommandEncoder.endEncoding();
|
||||
m_blitCommandEncoder = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void RendererContextMtl::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) BX_OVERRIDE
|
||||
{
|
||||
m_cmd.finish(false);
|
||||
@@ -3079,10 +3162,7 @@ namespace bgfx { namespace mtl
|
||||
uint16_t view = UINT16_MAX;
|
||||
FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
|
||||
|
||||
BlitKey blitKey;
|
||||
blitKey.decode(_render->m_blitKeys[0]);
|
||||
uint16_t numBlitItems = _render->m_numBlitItems;
|
||||
uint16_t blitItem = 0;
|
||||
BlitState bs(_render);
|
||||
|
||||
const uint64_t primType = 0;
|
||||
uint8_t primIndex = uint8_t(primType>>BGFX_STATE_PT_SHIFT);
|
||||
@@ -3170,62 +3250,7 @@ namespace bgfx { namespace mtl
|
||||
viewState.m_rect.m_width /= 2;
|
||||
}
|
||||
|
||||
const uint8_t blitView = SortKey::decodeView(encodedKey);
|
||||
for (; blitItem < numBlitItems && blitKey.m_view <= blitView; blitItem++)
|
||||
{
|
||||
if (0 != m_renderCommandEncoder)
|
||||
{
|
||||
m_renderCommandEncoder.endEncoding();
|
||||
m_renderCommandEncoder = 0;
|
||||
}
|
||||
m_blitCommandEncoder = getBlitCommandEncoder();
|
||||
|
||||
const BlitItem& blit = _render->m_blitItem[blitItem];
|
||||
blitKey.decode(_render->m_blitKeys[blitItem+1]);
|
||||
|
||||
const TextureMtl& src = m_textures[blit.m_src.idx];
|
||||
const TextureMtl& dst = m_textures[blit.m_dst.idx];
|
||||
|
||||
uint32_t srcWidth = bx::uint32_min(src.m_width, blit.m_srcX + blit.m_width) - blit.m_srcX;
|
||||
uint32_t srcHeight = bx::uint32_min(src.m_height, blit.m_srcY + blit.m_height) - blit.m_srcY;
|
||||
uint32_t srcDepth = bx::uint32_min(src.m_depth, blit.m_srcZ + blit.m_depth) - blit.m_srcZ;
|
||||
uint32_t dstWidth = bx::uint32_min(dst.m_width, blit.m_dstX + blit.m_width) - blit.m_dstX;
|
||||
uint32_t dstHeight = bx::uint32_min(dst.m_height, blit.m_dstY + blit.m_height) - blit.m_dstY;
|
||||
uint32_t dstDepth = bx::uint32_min(dst.m_depth, blit.m_dstZ + blit.m_depth) - blit.m_dstZ;
|
||||
uint32_t width = bx::uint32_min(srcWidth, dstWidth);
|
||||
uint32_t height = bx::uint32_min(srcHeight, dstHeight);
|
||||
uint32_t depth = bx::uint32_min(srcDepth, dstDepth);
|
||||
#if BX_PLATFORM_OSX
|
||||
bool readBack = !!(dst.m_flags & BGFX_TEXTURE_READ_BACK);
|
||||
#endif // BX_PLATFORM_OSX
|
||||
|
||||
if ( MTLTextureType3D == src.m_ptr.textureType())
|
||||
{
|
||||
m_blitCommandEncoder.copyFromTexture(src.m_ptr, 0, 0, MTLOriginMake(blit.m_srcX, blit.m_srcY, blit.m_srcZ), MTLSizeMake(width, height, bx::uint32_imax(depth, 1)),
|
||||
dst.m_ptr, 0, 0, MTLOriginMake(blit.m_dstX, blit.m_dstY, blit.m_dstZ));
|
||||
#if BX_PLATFORM_OSX
|
||||
if (m_macOS11Runtime &&readBack) {
|
||||
m_blitCommandEncoder.synchronizeResource(dst.m_ptr);
|
||||
}
|
||||
#endif // BX_PLATFORM_OSX
|
||||
}
|
||||
else
|
||||
{
|
||||
m_blitCommandEncoder.copyFromTexture(src.m_ptr, blit.m_srcZ, blit.m_srcMip, MTLOriginMake(blit.m_srcX, blit.m_srcY, 0), MTLSizeMake(width, height, 1),
|
||||
dst.m_ptr, blit.m_dstZ, blit.m_dstMip, MTLOriginMake(blit.m_dstX, blit.m_dstY, 0));
|
||||
#if BX_PLATFORM_OSX
|
||||
if (m_macOS11Runtime && readBack) {
|
||||
m_blitCommandEncoder.synchronizeTexture(dst.m_ptr, 0, blit.m_dstMip);
|
||||
}
|
||||
#endif // BX_PLATFORM_OSX
|
||||
}
|
||||
}
|
||||
|
||||
if (0 != m_blitCommandEncoder)
|
||||
{
|
||||
m_blitCommandEncoder.endEncoding();
|
||||
m_blitCommandEncoder = 0;
|
||||
}
|
||||
submitBlit(bs, view);
|
||||
|
||||
const Rect& scissorRect = _render->m_scissor[view];
|
||||
viewHasScissor = !scissorRect.isZero();
|
||||
@@ -3305,7 +3330,6 @@ namespace bgfx { namespace mtl
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: optimize store actions use discard flag
|
||||
RenderPassDepthAttachmentDescriptor depthAttachment = renderPassDescriptor.depthAttachment;
|
||||
if (NULL != depthAttachment.texture)
|
||||
{
|
||||
@@ -3337,7 +3361,6 @@ namespace bgfx { namespace mtl
|
||||
desc.loadAction = MTLLoadActionLoad;
|
||||
}
|
||||
|
||||
//TODO: optimize store actions use discard flag
|
||||
RenderPassDepthAttachmentDescriptor depthAttachment = renderPassDescriptor.depthAttachment;
|
||||
if (NULL != depthAttachment.texture)
|
||||
{
|
||||
@@ -3768,11 +3791,13 @@ namespace bgfx { namespace mtl
|
||||
//invalidateCompute();
|
||||
}
|
||||
|
||||
submitBlit(bs, BGFX_CONFIG_MAX_VIEWS);
|
||||
|
||||
if (0 < _render->m_num)
|
||||
{
|
||||
captureElapsed = -bx::getHPCounter();
|
||||
capture();
|
||||
rce = m_renderCommandEncoder; //TODO: ugly, can create new encoder
|
||||
rce = m_renderCommandEncoder;
|
||||
captureElapsed += bx::getHPCounter();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user