layers: Fix img layout state in CmdExecuteCommands
authorAlex Smith <asmith@feralinteractive.com>
Wed, 16 Aug 2017 08:23:27 +0000 (09:23 +0100)
committerMark Lobodzinski <mark@lunarg.com>
Wed, 16 Aug 2017 18:16:09 +0000 (12:16 -0600)
commit1fdcd3bc7fbd85f567a8270f6b7354c6f7b67661
treead3c8de9608c3ac1cc5c0f557d80b85cd1b5c9a6
parent75c6d3c8ccf58c2b4bb5eb14e8e6763b254bdc17
layers: Fix img layout state in CmdExecuteCommands

Previously the layout state in the primary command buffer was just
overwritten with the state in the secondary command buffer.

This can lead to spurious errors upon submission of the primary CB, if
an image used in the secondary CB is used prior to CmdExecuteCommands
in the primary CB with a different initial layout. This is because the
initialLayout field for the image on the primary CB is overwritten
with that of the secondary CB.

An example case that was incorrectly erroring (these commands refer to
the same image, newly created):

  (primary buffer)
  vkCmdPipelineBarrier, transition UNDEFINED -> TRANSFER_DST_OPTIMAL
  vkCmdExecuteCommands
    (secondary buffer)
    ...
    vkCmdCopyBufferToImage, layout TRANSFER_DST_OPTIMAL

Just before the CmdExecuteCommands, the image had initialLayout =
UNDEFINED and layout = TRANSFER_DST_OPTIMAL on the primary CB, and
initialLayout = layout = TRANSFER_DST_OPTIMAL on the secondary.

After CmdExecuteCommands, the primary CB state is overwritten, so
it has initialLayout = layout = TRANSFER_DST_OPTIMAL. At submission,
this then errors because the global image layout is UNDEFINED.

Fix by only setting initialLayout on the primary CB from the secondary
if the image hasn't already been used on the primary.

Change-Id: Iae248ed09b1f87598fd192ba3d6f0bcf7ad38ada
layers/core_validation.cpp