Skip to content

Commit

Permalink
Added proper barriers to allow for uniform uploads within renderpasses
Browse files Browse the repository at this point in the history
  • Loading branch information
haing committed Apr 20, 2016
1 parent 0994e33 commit 107a4a2
Show file tree
Hide file tree
Showing 54 changed files with 1,701 additions and 1,548 deletions.
9 changes: 7 additions & 2 deletions include/cinder/vk/Context.h
Expand Up @@ -126,7 +126,7 @@ class Context {
const vk::QueueRef& getGraphicsQueue() const { return mGraphicsQueue; }
const vk::QueueRef& getComputeQueue() const { return mComputeQueue; }
const vk::PresenterRef& getPresenter() const { return mPresenter; }
void addPresentWaitSemaphore( VkSemaphore semaphore, VkPipelineStageFlagBits waitDstStageMask );
void addRenderWaitSemaphore( VkSemaphore semaphore, VkPipelineStageFlagBits waitDstStageMask );

const vk::CommandPoolRef& getDefaultCommandPool() const { return mDefaultCommandPool; }
const vk::CommandPoolRef& getDefaultTransientCommandPool() const { return mDefaultCommandPool; }
Expand Down Expand Up @@ -283,10 +283,12 @@ class Context {
public:
ShaderProgRef& getStockShader( const vk::ShaderDef &shaderDef );

/*
void addPendingUniformVars( const vk::UniformBufferRef& buffer );
void addPendingUniformVars( const vk::UniformSetRef& uniformSetRef );
void addPendingUniformVars( const vk::BatchRef& batch );
void transferPendingUniformBuffer( const vk::CommandBufferRef& cmdBuf, VkAccessFlags srcAccessMask = VK_ACCESS_HOST_WRITE_BIT, VkAccessFlags dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT, VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_HOST_BIT, VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT );
*/

protected:
//! Returns \c true if \a value is different from the previous top of the stack
Expand Down Expand Up @@ -330,7 +332,10 @@ class Context {
vk::QueueRef mGraphicsQueue;
vk::QueueRef mComputeQueue;
vk::PresenterRef mPresenter;
std::vector<std::pair<VkSemaphore, VkPipelineStageFlagBits>> mPresentWaitSemaphores;

std::vector<std::pair<VkSemaphore, VkPipelineStageFlagBits>> mRenderWaitSemaphores;
const std::vector<std::pair<VkSemaphore, VkPipelineStageFlagBits>> getRenderWaitSemaphores() const { return mRenderWaitSemaphores; }
void clearRenderWaitSemaphores();

// Default graphics variables
std::pair<ivec2,ivec2> mDefaultViewport;
Expand Down
1 change: 1 addition & 0 deletions include/cinder/vk/Device.h
Expand Up @@ -168,6 +168,7 @@ class Device : public std::enable_shared_from_this<Device> {
Environment *mEnvironment = nullptr;

VkPhysicalDevice mGpu = VK_NULL_HANDLE;
VkPhysicalDeviceFeatures mGpuFeatures;
VkPhysicalDeviceProperties mGpuProperties;
VkPhysicalDeviceMemoryProperties mMemoryProperties;
std::vector<VkQueueFamilyProperties> mQueueFamilyProperties;
Expand Down
1 change: 1 addition & 0 deletions include/cinder/vk/Presenter.h
Expand Up @@ -95,6 +95,7 @@ class Presenter {
const vk::RenderPassRef& getCurrentRenderPass() const;

void resize( const ivec2& newWindowSize );
void clearSwapchainImages( vk::Context *context );
void transitionToFirstUse( vk::Context *context );

uint32_t acquireNextImage( VkFence fence, VkSemaphore signalSemaphore );
Expand Down
1 change: 1 addition & 0 deletions include/cinder/vk/RenderPass.h
Expand Up @@ -174,6 +174,7 @@ class RenderPass : public BaseDeviceObject, public std::enable_shared_from_this<
Options& addAttachment( const Attachment& value ) { mAttachments.push_back( value ); return *this; }
Options& addSubPass( const Subpass& value ) { mSubpasses.push_back( value ); return *this; }
Options& addSubpassDependency( const SubpassDependency& value ) { mSubpassDependencies.push_back( value ); return *this; }
Options& addSubpassSelfDependency( uint32_t subpassIndex, VkPipelineStageFlags srcStageMask = vk::PipelineStageGraphicsBits, VkPipelineStageFlags dstStageMask = vk::PipelineStageGraphicsBits, VkAccessFlags srcAccessMask = vk::AccessFlagsBits, VkAccessFlags dstAccessMask = vk::AccessFlagsBits );

private:
std::vector<Attachment> mAttachments;
Expand Down
2 changes: 1 addition & 1 deletion include/cinder/vk/ShaderProg.h
Expand Up @@ -239,7 +239,7 @@ class ShaderProg : public BaseDeviceObject {

bool isCompute() const;

const std::vector<VkPipelineShaderStageCreateInfo>& getPipelineShaderStages() const { return mPipelineShaderStages; }
const std::vector<VkPipelineShaderStageCreateInfo>& getShaderStages() const { return mPipelineShaderStages; }
const std::vector<VkPushConstantRange>& getCachedPushConstantRanges() const { return mCachedPushConstantRanges; }
VkPushConstantRange getCachedPushConstantRange( const std::string& name ) const;

Expand Down
19 changes: 19 additions & 0 deletions include/cinder/vk/platform.h
Expand Up @@ -105,5 +105,24 @@ const VkPipelineStageFlags PipelineStageGraphicsBits =
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
VK_PIPELINE_STAGE_TRANSFER_BIT |
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;

const VkAccessFlags AccessFlagsBits =
VK_ACCESS_INDIRECT_COMMAND_READ_BIT |
VK_ACCESS_INDEX_READ_BIT |
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
VK_ACCESS_UNIFORM_READ_BIT |
VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
VK_ACCESS_SHADER_READ_BIT |
VK_ACCESS_SHADER_WRITE_BIT |
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
VK_ACCESS_TRANSFER_READ_BIT |
VK_ACCESS_TRANSFER_WRITE_BIT |
VK_ACCESS_HOST_READ_BIT |
VK_ACCESS_HOST_WRITE_BIT |
VK_ACCESS_MEMORY_READ_BIT |
VK_ACCESS_MEMORY_WRITE_BIT;

} } // namespace ci::vk
7 changes: 7 additions & 0 deletions include/cinder/vk/wrapper.h
Expand Up @@ -248,4 +248,11 @@ inline void translate( const ci::vec2 &v ) { translate( vec3( v, 0 ) ); }
//! Translates the Model matrix by (\a x,\a y)
inline void translate( float x, float y ) { translate( vec3( x, y, 0 ) ); }

void color( float r, float g, float b );
void color( float r, float g, float b, float a );
void color( const ci::Color &c );
void color( const ci::ColorA &c );
void color( const ci::Color8u &c );
void color( const ci::ColorA8u &c );

}} // namespace cinder::vk
29 changes: 11 additions & 18 deletions samples/_vulkan/ComputeBasic/src/ComputeBasicApp.cpp
Expand Up @@ -128,8 +128,7 @@ void ComputeBasicApp::update()
{
float t = 2.0f*getElapsedSeconds();
mComputeUniformSet->uniform( "ciBlock0.pos", vec2( 0.5 ) + 0.5f*vec2( cos( t ), sin( t ) ) );
vk::context()->addPendingUniformVars( mComputeUniformSet );
vk::context()->transferPendingUniformBuffer( mComputeCmdBuf, VK_ACCESS_UNIFORM_READ_BIT, VK_ACCESS_UNIFORM_READ_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT );
mComputeUniformSet->bufferPending( mComputeCmdBuf, VK_ACCESS_UNIFORM_READ_BIT, VK_ACCESS_UNIFORM_READ_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT );

mComputeCmdBuf->bindPipeline( VK_PIPELINE_BIND_POINT_COMPUTE, mComputePipeline );

Expand All @@ -146,21 +145,13 @@ void ComputeBasicApp::update()
mComputeCmdBuf->end();

vk::context()->getComputeQueue()->submit( mComputeCmdBuf, VK_NULL_HANDLE, 0, VK_NULL_HANDLE, mComputeDoneSemaphore );
vk::context()->addPresentWaitSemaphore( mComputeDoneSemaphore, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT );
}

// Update uniforms
{
//vk::setMatrices( mCam );
vk::setMatricesWindow( getWindowSize() );

mBatch->setDefaultUniformVars( vk::context() );
vk::context()->addPendingUniformVars( mBatch );
vk::context()->addRenderWaitSemaphore( mComputeDoneSemaphore, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT );
}
}

void ComputeBasicApp::draw()
{
vk::setMatricesWindow( getWindowSize() );
mBatch->draw();
}

Expand Down Expand Up @@ -195,15 +186,17 @@ VkBool32 debugReportVk(

const std::vector<std::string> gLayers = {
//"VK_LAYER_LUNARG_api_dump",
//"VK_LAYER_LUNARG_threading",
//"VK_LAYER_LUNARG_mem_tracker",
//"VK_LAYER_LUNARG_object_tracker",
//"VK_LAYER_LUNARG_draw_state",
//"VK_LAYER_LUNARG_param_checker",
//"VK_LAYER_LUNARG_swapchain",
//"VK_LAYER_LUNARG_core_validation",
//"VK_LAYER_LUNARG_device_limits",
//"VK_LAYER_LUNARG_image",
//"VK_LAYER_LUNARG_object_tracker",
//"VK_LAYER_LUNARG_parameter_validation",
//"VK_LAYER_LUNARG_screenshot",
//"VK_LAYER_LUNARG_swapchain",
//"VK_LAYER_GOOGLE_threading",
//"VK_LAYER_GOOGLE_unique_objects",
//"VK_LAYER_LUNARG_vktrace",
//"VK_LAYER_LUNARG_standard_validation",
};

CINDER_APP(
Expand Down
109 changes: 70 additions & 39 deletions samples/_vulkan/ComputeBasic/vc2013/vk_layer_settings.txt
@@ -1,39 +1,70 @@
# VK_LAYER_LUNARG_api_dump
ApiDumpDetailed = TRUE
ApiDumpNoAddr = FALSE
ApiDumpFile = TRUE
ApiDumpLogFilename = vk_api_dump_log.txt
ApiDumpFlush = FALSE

# VK_LAYER_LUNARG_param_checker
ParamCheckerDebugAction = VK_DBG_LAYER_ACTION_LOG_MSG
ParamCheckerReportFlags = debug,info,error,warn,perf
ParamCheckerDetailed = TRUE
ParamCheckerFile = TRUE
ParamCheckerLogFilename = vk_param_checker_log.txt
ParamCheckerFlush = FALSE

# VK_LAYER_LUNARG_mem_tracker
MemTrackerDebugAction = VK_DBG_LAYER_ACTION_LOG_MSG
MemTrackerReportFlags = debug,info,error,warn,perf
MemTrackerDetailed = TRUE
MemTrackerFile = TRUE
MemTrackerLogFilename = vk_mem_tracker_log.txt
MemTrackerFlush = FALSE

# VK_LAYER_LUNARG_device_limits
DeviceLimitsDebugAction = VK_DBG_LAYER_ACTION_LOG_MSG
DeviceLimitsReportFlags = debug,info,error,warn,perf
DeviceLimitsDetailed = TRUE
DeviceLimitsFile = TRUE
DeviceLimitsLogFilename = vk_device_limits_log.txt
DeviceLimitsFlush = FALSE


# VK_LAYER_LUNARG_draw_state
DrawStateDebugAction = VK_DBG_LAYER_ACTION_LOG_MSG
DrawStateReportFlags = debug,info,error,warn,perf
DrawStateDetailed = TRUE
DrawStateFile = TRUE
DrawStateLogFilename = vk_drawstate_log.txt
DrawStateFlush = FALSE
# VK_LAYER_LUNARG_api_dump Settings
lunarg_api_dump.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_api_dump.report_flags = info,warn,perf,error,debug
lunarg_api_dump.log_filename = stdout

# VK_LAYER_LUNARG_core_validation Settings
lunarg_core_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_core_validation.report_flags = info,warn,perf,error,debug
lunarg_core_validation.log_filename = stdout

# VK_LAYER_LUNARG_device_limits Settings
lunarg_device_limits.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_device_limits.report_flags = info,warn,perf,error,debug
lunarg_device_limits.log_filename = stdout

# VK_LAYER_LUNARG_image Settings
lunarg_image.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_image.report_flags = info,warn,perf,error,debug
lunarg_image.log_filename = stdout

# VK_LAYER_LUNARG_object_tracker Settings
lunarg_object_tracker.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_object_tracker.report_flags = info,warn,perf,error,debug
lunarg_object_tracker.log_filename = stdout

# VK_LAYER_LUNARG_parameter_validation Settings
lunarg_parameter_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_parameter_validation.report_flags = info,warn,perf,error,debug
lunarg_parameter_validation.log_filename = stdout

# VK_LAYER_LUNARG_screenshot Settings
lunarg_screenshot.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_screenshot.report_flags = info,warn,perf,error,debug
lunarg_screenshot.log_filename = stdout

# VK_LAYER_LUNARG_swapchain Settings
lunarg_swapchain.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_swapchain.report_flags = info,warn,perf,error,debug
lunarg_swapchain.log_filename = stdout

# VK_LAYER_GOOGLE_threading Settings
google_threading.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
google_threading.report_flags = info,warn,perf,error,debug
google_threading.log_filename = stdout

# VK_LAYER_GOOGLE_unique_objects Settings
google_unique_objects.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
google_unique_objects.report_flags = info,warn,perf,error,debug
google_unique_objects.log_filename = stdout

# VK_LAYER_LUNARG_vktrace Settings
lunarg_vktrace.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_vktrace.report_flags = info,warn,perf,error,debug
lunarg_vktrace.log_filename = stdout

# VK_LAYER_RENDERDOC_Capture Settings
renderdoc_capture.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
renderdoc_capture.report_flags = info,warn,perf,error,debug
renderdoc_capture.log_filename = stdout

# VK_LAYER_VALVE_steam_overlay Settings
valve_steam_overlay.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
valve_steam_overlay.report_flags = info,warn,perf,error,debug
valve_steam_overlay.log_filename = stdout

# VK_LAYER_LUNARG_standard_validation Settings
lunarg_standard_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
lunarg_standard_validation.report_flags = info,warn,perf,error,debug
lunarg_standard_validation.log_filename = stdout

39 changes: 12 additions & 27 deletions samples/_vulkan/Cube/src/CubeApp.cpp
Expand Up @@ -118,19 +118,6 @@ void RotatingCubeApp::update()
{
// Rotate the cube by 0.2 degrees around the y-axis
mCubeRotation *= rotate( toRadians( 0.2f ), normalize( vec3( 0, 1, 0 ) ) );

/*
// Update uniforms
{
vk::setMatrices( mCam );
vk::ScopedModelMatrix modelScope;
vk::multModelMatrix( mCubeRotation );
mBatch->setDefaultUniformVars( vk::context() );
vk::context()->addPendingUniformVars( mBatch );
}
*/
}

void RotatingCubeApp::draw()
Expand Down Expand Up @@ -176,20 +163,18 @@ VkBool32 debugReportVk(
}

const std::vector<std::string> gLayers = {
"VK_LAYER_LUNARG_api_dump",
"VK_LAYER_LUNARG_core_validation",
"VK_LAYER_LUNARG_device_limits",
"VK_LAYER_LUNARG_image",
"VK_LAYER_LUNARG_object_tracker",
"VK_LAYER_LUNARG_parameter_validation",
"VK_LAYER_LUNARG_screenshot",
"VK_LAYER_LUNARG_swapchain",
"VK_LAYER_GOOGLE_threading",
"VK_LAYER_GOOGLE_unique_objects",
"VK_LAYER_LUNARG_vktrace",
//"VK_LAYER_RENDERDOC_Capture",
//"VK_LAYER_VALVE_steam_overlay",
"VK_LAYER_LUNARG_standard_validation",
//"VK_LAYER_LUNARG_api_dump",
//"VK_LAYER_LUNARG_core_validation",
//"VK_LAYER_LUNARG_device_limits",
//"VK_LAYER_LUNARG_image",
//"VK_LAYER_LUNARG_object_tracker",
//"VK_LAYER_LUNARG_parameter_validation",
//"VK_LAYER_LUNARG_screenshot",
//"VK_LAYER_LUNARG_swapchain",
//"VK_LAYER_GOOGLE_threading",
//"VK_LAYER_GOOGLE_unique_objects",
//"VK_LAYER_LUNARG_vktrace",
//"VK_LAYER_LUNARG_standard_validation",
};

CINDER_APP(
Expand Down
29 changes: 13 additions & 16 deletions samples/_vulkan/CubeMapping/src/CubeMappingApp.cpp
Expand Up @@ -116,32 +116,27 @@ void CubeMappingApp::update()

// rotate the object (teapot) a bit each frame
mObjectRotation *= rotate( 0.04f, normalize( vec3( 0.1f, 1, 0.1f ) ) );
}

void CubeMappingApp::draw()
{
// Update uniforms
{
vk::setMatrices( mCam );

vk::pushMatrices();
vk::multModelMatrix( mObjectRotation );
vk::scale( vec3( 4 ) );
mTeapotBatch->setDefaultUniformVars( vk::context() );
vk::context()->addPendingUniformVars( mTeapotBatch );
mTeapotBatch->draw();
vk::popMatrices();

vk::pushMatrices();
vk::scale( SKY_BOX_SIZE, SKY_BOX_SIZE, SKY_BOX_SIZE );
mSkyBoxBatch->setDefaultUniformVars( vk::context() );
vk::context()->addPendingUniformVars( mSkyBoxBatch );
mSkyBoxBatch->draw();
vk::popMatrices();
}
}

void CubeMappingApp::draw()
{
mTeapotBatch->draw();
mSkyBoxBatch->draw();
}

VkBool32 debugReportVk(
VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objectType,
Expand Down Expand Up @@ -173,15 +168,17 @@ VkBool32 debugReportVk(

const std::vector<std::string> gLayers = {
//"VK_LAYER_LUNARG_api_dump",
//"VK_LAYER_LUNARG_threading",
//"VK_LAYER_LUNARG_mem_tracker",
//"VK_LAYER_LUNARG_core_validation",
//"VK_LAYER_LUNARG_device_limits",
//"VK_LAYER_LUNARG_image",
//"VK_LAYER_LUNARG_object_tracker",
//"VK_LAYER_LUNARG_draw_state",
//"VK_LAYER_LUNARG_param_checker",
//"VK_LAYER_LUNARG_parameter_validation",
//"VK_LAYER_LUNARG_screenshot",
//"VK_LAYER_LUNARG_swapchain",
//"VK_LAYER_LUNARG_device_limits"
//"VK_LAYER_LUNARG_image",
//"VK_LAYER_GOOGLE_threading",
//"VK_LAYER_GOOGLE_unique_objects",
//"VK_LAYER_LUNARG_vktrace",
//"VK_LAYER_LUNARG_standard_validation",
};

CINDER_APP(
Expand Down

0 comments on commit 107a4a2

Please sign in to comment.