Index: command_buffer/client/cross/cmd_buffer_helper.h |
=================================================================== |
--- command_buffer/client/cross/cmd_buffer_helper.h (revision 26638) |
+++ command_buffer/client/cross/cmd_buffer_helper.h (working copy) |
@@ -90,6 +90,27 @@ |
// the size of the buffer minus one. |
void WaitForAvailableEntries(unsigned int count); |
+ // Adds a command data to the command buffer. This may wait until sufficient |
+ // space is available. |
+ // Parameters: |
+ // entries: The command entries to add. |
+ // count: The number of entries. |
+ void AddCommandData(CommandBufferEntry* entries, unsigned int count) { |
+ WaitForAvailableEntries(count); |
+ for (; count > 0; --count) { |
+ entries_[put_++] = *entries++; |
+ } |
+ DCHECK_LE(put_, entry_count_); |
+ if (put_ == entry_count_) put_ = 0; |
+ } |
+ |
+ // A typed version of AddCommandData. |
+ template <typename T> |
+ void AddTypedCmdData(T& cmd) { |
+ AddCommandData(reinterpret_cast<CommandBufferEntry*>(&cmd), |
+ ComputeNumEntries(sizeof(cmd))); |
+ } |
+ |
// Adds a command to the command buffer. This may wait until sufficient space |
// is available. |
// Parameters: |
@@ -130,13 +151,612 @@ |
// Returns the buffer interface used to send synchronous commands. |
BufferSyncInterface *interface() { return interface_; } |
+ // Waits for a certain amount of space to be available. Returns address |
+ // of space. |
+ CommandBufferEntry* GetSpace(uint32 entries); |
+ |
+ // Typed version of GetSpace. Gets enough room for the given type and returns |
+ // a reference to it. |
+ template <typename T> |
+ T& GetCmdSpace() { |
+ COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed); |
+ uint32 space_needed = ComputeNumEntries(sizeof(T)); |
+ void* data = GetSpace(space_needed); |
+ return *reinterpret_cast<T*>(data); |
+ } |
+ |
+ // Typed version of GetSpace for immediate commands. |
+ template <typename T> |
+ T& GetImmediateCmdSpace(size_t space) { |
+ COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); |
+ uint32 space_needed = ComputeNumEntries(sizeof(T) + space); |
+ void* data = GetSpace(space_needed); |
+ return *reinterpret_cast<T*>(data); |
+ } |
+ |
+ // ------------------ Individual commands ---------------------- |
+ |
+ void Noop(uint32 skip_count) { |
+ cmd::Noop& cmd = GetImmediateCmdSpace<cmd::Noop>( |
+ skip_count * sizeof(CommandBufferEntry)); |
+ cmd.Init(skip_count); |
+ } |
+ |
+ |
+ void SetToken(uint32 token) { |
+ cmd::SetToken& cmd = GetCmdSpace<cmd::SetToken>(); |
+ cmd.Init(token); |
+ } |
+ |
+ |
+ void BeginFrame() { |
+ cmd::BeginFrame& cmd = GetCmdSpace<cmd::BeginFrame>(); |
+ cmd.Init(); |
+ } |
+ |
+ |
+ void EndFrame() { |
+ cmd::EndFrame& cmd = GetCmdSpace<cmd::EndFrame>(); |
+ cmd.Init(); |
+ } |
+ |
+ void Clear( |
+ uint32 buffers, |
+ float red, float green, float blue, float alpha, |
+ float depth, uint32 stencil) { |
+ cmd::Clear& cmd = GetCmdSpace<cmd::Clear>(); |
+ cmd.Init(buffers, red, green, blue, alpha, depth, stencil); |
+ } |
+ |
+ void SetViewport( |
+ uint32 left, |
+ uint32 top, |
+ uint32 width, |
+ uint32 height, |
+ float z_min, |
+ float z_max) { |
+ cmd::SetViewport& cmd = GetCmdSpace<cmd::SetViewport>(); |
+ cmd.Init(left, top, width, height, z_min, z_max); |
+ } |
+ |
+ void CreateVertexBuffer(uint32 id, uint32 size, uint32 flags) { |
+ cmd::CreateVertexBuffer& cmd = GetCmdSpace<cmd::CreateVertexBuffer>(); |
+ cmd.Init(id, size, flags); |
+ } |
+ |
+ void DestroyVertexBuffer(uint32 id) { |
+ cmd::DestroyVertexBuffer& cmd = GetCmdSpace<cmd::DestroyVertexBuffer>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void SetVertexBufferDataImmediate( |
+ uint32 id, uint32 offset, |
+ const void* data, uint32 size) { |
+ cmd::SetVertexBufferDataImmediate& cmd = |
+ GetImmediateCmdSpace<cmd::SetVertexBufferDataImmediate>(size); |
+ cmd.Init(id, offset, data, size); |
+ } |
+ |
+ void SetVertexBufferData( |
+ uint32 id, uint32 offset, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::SetVertexBufferData& cmd = |
+ GetCmdSpace<cmd::SetVertexBufferData>(); |
+ cmd.Init(id, offset, size, |
+ shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void GetVertexBufferData( |
+ uint32 id, uint32 offset, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::GetVertexBufferData& cmd = |
+ GetCmdSpace<cmd::GetVertexBufferData>(); |
+ cmd.Init(id, offset, size, |
+ shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void CreateIndexBuffer(uint32 id, uint32 size, uint32 flags) { |
+ cmd::CreateIndexBuffer& cmd = |
+ GetCmdSpace<cmd::CreateIndexBuffer>(); |
+ cmd.Init(id, size, flags); |
+ } |
+ |
+ void DestroyIndexBuffer(uint32 id) { |
+ cmd::DestroyIndexBuffer& cmd = GetCmdSpace<cmd::DestroyIndexBuffer>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void SetIndexBufferDataImmediate( |
+ uint32 id, uint32 offset, const void* data, uint32 size) { |
+ cmd::SetIndexBufferDataImmediate& cmd = |
+ GetImmediateCmdSpace<cmd::SetIndexBufferDataImmediate>(size); |
+ cmd.Init(id, offset, data, size); |
+ } |
+ |
+ void SetIndexBufferData( |
+ uint32 id, uint32 offset, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::SetIndexBufferData& cmd = GetCmdSpace<cmd::SetIndexBufferData>(); |
+ cmd.Init(id, offset, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void GetIndexBufferData( |
+ uint32 id, uint32 offset, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::GetIndexBufferData& cmd = GetCmdSpace<cmd::GetIndexBufferData>(); |
+ cmd.Init(id, offset, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void CreateVertexStruct(uint32 id, uint32 input_count) { |
+ cmd::CreateVertexStruct& cmd = GetCmdSpace<cmd::CreateVertexStruct>(); |
+ cmd.Init(id, input_count); |
+ } |
+ |
+ void DestroyVertexStruct(uint32 id) { |
+ cmd::DestroyVertexStruct& cmd = GetCmdSpace<cmd::DestroyVertexStruct>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void SetVertexInput( |
+ uint32 vertex_struct_id, |
+ uint32 input_index, |
+ uint32 vertex_buffer_id, |
+ uint32 offset, |
+ uint8 semantic, |
+ uint32 semantic_index, |
+ uint8 type, |
+ uint32 stride) { |
+ cmd::SetVertexInput& cmd = GetCmdSpace<cmd::SetVertexInput>(); |
+ cmd.Init( |
+ vertex_struct_id, |
+ input_index, |
+ vertex_buffer_id, |
+ offset, |
+ semantic, |
+ semantic_index, |
+ type, |
+ stride); |
+ } |
+ |
+ void SetVertexStruct(uint32 id) { |
+ cmd::SetVertexStruct& cmd = GetCmdSpace<cmd::SetVertexStruct>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void Draw(uint32 primitive_type, uint32 first, uint32 count) { |
+ cmd::Draw& cmd = GetCmdSpace<cmd::Draw>(); |
+ cmd.Init(primitive_type, first, count); |
+ } |
+ |
+ void DrawIndexed( |
+ uint32 primitive_type, |
+ uint32 index_buffer_id, |
+ uint32 first, |
+ uint32 count, |
+ uint32 min_index, |
+ uint32 max_index) { |
+ cmd::DrawIndexed& cmd = GetCmdSpace<cmd::DrawIndexed>(); |
+ cmd.Init( |
+ primitive_type, |
+ index_buffer_id, |
+ first, |
+ count, |
+ min_index, |
+ max_index); |
+ } |
+ |
+ void CreateEffect( |
+ uint32 id, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::CreateEffect& cmd = GetCmdSpace<cmd::CreateEffect>(); |
+ cmd.Init(id, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void CreateEffectImmediate(uint32 id, uint32 size, const void* data) { |
+ cmd::CreateEffectImmediate& cmd = |
+ GetImmediateCmdSpace<cmd::CreateEffectImmediate>(size); |
+ cmd.Init(id, size, data); |
+ } |
+ |
+ void DestroyEffect(uint32 id) { |
+ cmd::DestroyEffect& cmd = GetCmdSpace<cmd::DestroyEffect>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void SetEffect(uint32 id) { |
+ cmd::SetEffect& cmd = GetCmdSpace<cmd::SetEffect>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void GetParamCount( |
+ uint32 id, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::GetParamCount& cmd = GetCmdSpace<cmd::GetParamCount>(); |
+ cmd.Init(id, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void CreateParam(uint32 param_id, uint32 effect_id, uint32 index) { |
+ cmd::CreateParam& cmd = GetCmdSpace<cmd::CreateParam>(); |
+ cmd.Init(param_id, effect_id, index); |
+ } |
+ |
+ void CreateParamByName( |
+ uint32 param_id, uint32 effect_id, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::CreateParamByName& cmd = GetCmdSpace<cmd::CreateParamByName>(); |
+ cmd.Init(param_id, effect_id, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void CreateParamByNameImmediate( |
+ uint32 param_id, uint32 effect_id, uint32 size, const void* data) { |
+ cmd::CreateParamByNameImmediate& cmd = |
+ GetImmediateCmdSpace<cmd::CreateParamByNameImmediate>(size); |
+ cmd.Init(param_id, effect_id, size, data); |
+ } |
+ |
+ void DestroyParam(uint32 id) { |
+ cmd::DestroyParam& cmd = GetCmdSpace<cmd::DestroyParam>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void SetParamData( |
+ uint32 id, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::SetParamData& cmd = GetCmdSpace<cmd::SetParamData>(); |
+ cmd.Init(id, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void SetParamDataImmediate(uint32 id, uint32 size, const void* data) { |
+ cmd::SetParamDataImmediate& cmd = |
+ GetImmediateCmdSpace<cmd::SetParamDataImmediate>(size); |
+ cmd.Init(id, size, data); |
+ } |
+ |
+ void GetParamDesc( |
+ uint32 id, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::GetParamDesc& cmd = GetCmdSpace<cmd::GetParamDesc>(); |
+ cmd.Init(id, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void GetStreamCount( |
+ uint32 id, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::GetStreamCount& cmd = GetCmdSpace<cmd::GetStreamCount>(); |
+ cmd.Init(id, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void GetStreamDesc( |
+ uint32 id, uint32 index, uint32 size, |
+ uint32 shared_memory_id, uint32 shared_memory_offset) { |
+ cmd::GetStreamDesc& cmd = GetCmdSpace<cmd::GetStreamDesc>(); |
+ cmd.Init(id, index, size, shared_memory_id, shared_memory_offset); |
+ } |
+ |
+ void DestroyTexture(uint32 id) { |
+ cmd::DestroyTexture& cmd = GetCmdSpace<cmd::DestroyTexture>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void CreateTexture2d( |
+ uint32 texture_id, |
+ uint32 width, uint32 height, |
+ uint32 levels, uint32 format, |
+ uint32 enable_render_surfaces) { |
+ cmd::CreateTexture2d& cmd = GetCmdSpace<cmd::CreateTexture2d>(); |
+ cmd.Init(texture_id, |
+ width, height, levels, format, |
+ enable_render_surfaces); |
+ } |
+ |
+ void CreateTexture3d( |
+ uint32 texture_id, |
+ uint32 width, uint32 height, uint32 depth, |
+ uint32 levels, uint32 format, |
+ uint32 enable_render_surfaces) { |
+ cmd::CreateTexture3d& cmd = GetCmdSpace<cmd::CreateTexture3d>(); |
+ cmd.Init(texture_id, |
+ width, height, depth, |
+ levels, format, |
+ enable_render_surfaces); |
+ } |
+ |
+ void CreateTextureCube( |
+ uint32 texture_id, |
+ uint32 edge_length, uint32 levels, uint32 format, |
+ uint32 enable_render_surfaces) { |
+ cmd::CreateTextureCube& cmd = GetCmdSpace<cmd::CreateTextureCube>(); |
+ cmd.Init(texture_id, |
+ edge_length, levels, format, |
+ enable_render_surfaces); |
+ } |
+ |
+ void SetTextureData( |
+ uint32 texture_id, |
+ uint32 x, |
+ uint32 y, |
+ uint32 z, |
+ uint32 width, |
+ uint32 height, |
+ uint32 depth, |
+ uint32 level, |
+ uint32 face, |
+ uint32 row_pitch, |
+ uint32 slice_pitch, |
+ uint32 size, |
+ uint32 shared_memory_id, |
+ uint32 shared_memory_offset) { |
+ cmd::SetTextureData& cmd = GetCmdSpace<cmd::SetTextureData>(); |
+ cmd.Init( |
+ texture_id, |
+ x, |
+ y, |
+ z, |
+ width, |
+ height, |
+ depth, |
+ level, |
+ face, |
+ row_pitch, |
+ slice_pitch, |
+ size, |
+ shared_memory_id, |
+ shared_memory_offset); |
+ } |
+ |
+ void SetTextureDataImmediate( |
+ uint32 texture_id, |
+ uint32 x, |
+ uint32 y, |
+ uint32 z, |
+ uint32 width, |
+ uint32 height, |
+ uint32 depth, |
+ uint32 level, |
+ uint32 face, |
+ uint32 row_pitch, |
+ uint32 slice_pitch, |
+ uint32 size, |
+ const void* data) { |
+ cmd::SetTextureDataImmediate& cmd = |
+ GetImmediateCmdSpace<cmd::SetTextureDataImmediate>(size); |
+ cmd.Init( |
+ texture_id, |
+ x, |
+ y, |
+ z, |
+ width, |
+ height, |
+ depth, |
+ level, |
+ face, |
+ row_pitch, |
+ slice_pitch, |
+ size, |
+ data); |
+ } |
+ |
+ void GetTextureData( |
+ uint32 texture_id, |
+ uint32 x, |
+ uint32 y, |
+ uint32 z, |
+ uint32 width, |
+ uint32 height, |
+ uint32 depth, |
+ uint32 level, |
+ uint32 face, |
+ uint32 row_pitch, |
+ uint32 slice_pitch, |
+ uint32 size, |
+ uint32 shared_memory_id, |
+ uint32 shared_memory_offset) { |
+ cmd::GetTextureData& cmd = GetCmdSpace<cmd::GetTextureData>(); |
+ cmd.Init( |
+ texture_id, |
+ x, |
+ y, |
+ z, |
+ width, |
+ height, |
+ depth, |
+ level, |
+ face, |
+ row_pitch, |
+ slice_pitch, |
+ size, |
+ shared_memory_id, |
+ shared_memory_offset); |
+ } |
+ |
+ void CreateSampler(uint32 id) { |
+ cmd::CreateSampler& cmd = GetCmdSpace<cmd::CreateSampler>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void DestroySampler(uint32 id) { |
+ cmd::DestroySampler& cmd = GetCmdSpace<cmd::DestroySampler>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void SetSamplerStates(uint32 id, |
+ uint32 address_u_value, |
+ uint32 address_v_value, |
+ uint32 address_w_value, |
+ uint32 mag_filter_value, |
+ uint32 min_filter_value, |
+ uint32 mip_filter_value, |
+ uint32 max_anisotropy) { |
+ cmd::SetSamplerStates& cmd = GetCmdSpace<cmd::SetSamplerStates>(); |
+ cmd.Init( |
+ id, |
+ address_u_value, |
+ address_v_value, |
+ address_w_value, |
+ mag_filter_value, |
+ min_filter_value, |
+ mip_filter_value, |
+ max_anisotropy); |
+ } |
+ |
+ void SetSamplerBorderColor( |
+ uint32 id, |
+ float red, float green, float blue, float alpha) { |
+ cmd::SetSamplerBorderColor& cmd = |
+ GetCmdSpace<cmd::SetSamplerBorderColor>(); |
+ cmd.Init(id, red, green, blue, alpha); |
+ } |
+ |
+ void SetSamplerTexture(uint32 id, uint32 texture_id) { |
+ cmd::SetSamplerTexture& cmd = GetCmdSpace<cmd::SetSamplerTexture>(); |
+ cmd.Init(id, texture_id); |
+ } |
+ |
+ void SetScissor( |
+ uint32 x, |
+ uint32 y, |
+ uint32 width, |
+ uint32 height, |
+ bool enable) { |
+ cmd::SetScissor& cmd = GetCmdSpace<cmd::SetScissor>(); |
+ cmd.Init( |
+ x, |
+ y, |
+ width, |
+ height, |
+ enable); |
+ } |
+ |
+ void SetPolygonOffset(float slope_factor, float units) { |
+ cmd::SetPolygonOffset& cmd = GetCmdSpace<cmd::SetPolygonOffset>(); |
+ cmd.Init(slope_factor, units); |
+ } |
+ |
+ void SetPointLineRaster( |
+ bool line_smooth_enable, bool point_sprite_enable, float point_size) { |
+ cmd::SetPointLineRaster& cmd = GetCmdSpace<cmd::SetPointLineRaster>(); |
+ cmd.Init(line_smooth_enable, point_sprite_enable, point_size); |
+ } |
+ |
+ void SetPolygonRaster(uint32 fill_mode, uint32 cull_mode) { |
+ cmd::SetPolygonRaster& cmd = GetCmdSpace<cmd::SetPolygonRaster>(); |
+ cmd.Init(fill_mode, cull_mode); |
+ } |
+ |
+ void SetAlphaTest(uint32 func, bool enable, float value) { |
+ cmd::SetAlphaTest& cmd = GetCmdSpace<cmd::SetAlphaTest>(); |
+ cmd.Init(func, enable, value); |
+ } |
+ |
+ void SetDepthTest(uint32 func, bool write_enable, bool enable) { |
+ cmd::SetDepthTest& cmd = GetCmdSpace<cmd::SetDepthTest>(); |
+ cmd.Init(func, write_enable, enable); |
+ } |
+ |
+ void SetStencilTest( |
+ uint8 write_mask, |
+ uint8 compare_mask, |
+ uint8 reference_value, |
+ bool separate_ccw, |
+ bool enable, |
+ uint8 cw_func, |
+ uint8 cw_pass_op, |
+ uint8 cw_fail_op, |
+ uint8 cw_z_fail_op, |
+ uint8 ccw_func, |
+ uint8 ccw_pass_op, |
+ uint8 ccw_fail_op, |
+ uint8 ccw_z_fail_op) { |
+ cmd::SetStencilTest& cmd = GetCmdSpace<cmd::SetStencilTest>(); |
+ cmd.Init( |
+ write_mask, |
+ compare_mask, |
+ reference_value, |
+ separate_ccw, |
+ enable, |
+ cw_func, |
+ cw_pass_op, |
+ cw_fail_op, |
+ cw_z_fail_op, |
+ ccw_func, |
+ ccw_pass_op, |
+ ccw_fail_op, |
+ ccw_z_fail_op); |
+ } |
+ |
+ void SetColorWrite(uint8 mask, bool dither_enable) { |
+ cmd::SetColorWrite& cmd = GetCmdSpace<cmd::SetColorWrite>(); |
+ cmd.Init(mask, dither_enable); |
+ } |
+ |
+ void SetBlending( |
+ uint8 color_src_func, |
+ uint8 color_dst_func, |
+ uint8 color_eq, |
+ uint8 alpha_src_func, |
+ uint8 alpha_dst_func, |
+ uint8 alpha_eq, |
+ bool separate_alpha, |
+ bool enable) { |
+ cmd::SetBlending& cmd = GetCmdSpace<cmd::SetBlending>(); |
+ cmd.Init( |
+ color_src_func, |
+ color_dst_func, |
+ color_eq, |
+ alpha_src_func, |
+ alpha_dst_func, |
+ alpha_eq, |
+ separate_alpha, |
+ enable); |
+ } |
+ |
+ void SetBlendingColor(float red, float green, float blue, float alpha) { |
+ cmd::SetBlendingColor& cmd = GetCmdSpace<cmd::SetBlendingColor>(); |
+ cmd.Init(red, green, blue, alpha); |
+ } |
+ |
+ void CreateRenderSurface( |
+ uint32 id, uint32 texture_id, |
+ uint32 width, uint32 height, |
+ uint32 level, uint32 side) { |
+ cmd::CreateRenderSurface& cmd = GetCmdSpace<cmd::CreateRenderSurface>(); |
+ cmd.Init(id, texture_id, width, height, level, side); |
+ } |
+ |
+ void DestroyRenderSurface(uint32 id) { |
+ cmd::DestroyRenderSurface& cmd = |
+ GetCmdSpace<cmd::DestroyRenderSurface>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void CreateDepthSurface(uint32 id, uint32 width, uint32 height) { |
+ cmd::CreateDepthSurface& cmd = GetCmdSpace<cmd::CreateDepthSurface>(); |
+ cmd.Init(id, width, height); |
+ } |
+ |
+ void DestroyDepthSurface(uint32 id) { |
+ cmd::DestroyDepthSurface& cmd = GetCmdSpace<cmd::DestroyDepthSurface>(); |
+ cmd.Init(id); |
+ } |
+ |
+ void SetRenderSurface(uint32 render_surface_id, uint32 depth_surface_id) { |
+ cmd::SetRenderSurface& cmd = GetCmdSpace<cmd::SetRenderSurface>(); |
+ cmd.Init(render_surface_id, depth_surface_id); |
+ } |
+ |
+ void SetBackSurfaces() { |
+ cmd::SetBackSurfaces& cmd = GetCmdSpace<cmd::SetBackSurfaces>(); |
+ cmd.Init(); |
+ } |
+ |
private: |
// Waits until get changes, updating the value of get_. |
void WaitForGetChange(); |
// Returns the number of available entries (they may not be contiguous). |
unsigned int AvailableEntries() { |
- return (get_ - put_ - 1 + entry_count_) % entry_count_; |
+ return static_cast<unsigned int>( |
+ (get_ - put_ - 1 + entry_count_) % entry_count_); |
} |
BufferSyncInterface *interface_; |