15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_COMMON_COMMAND_BUFFER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_COMMON_COMMAND_BUFFER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/buffer.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/constants.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/gpu_export.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SharedMemory; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common interface for CommandBuffer implementations. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT CommandBuffer { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct State { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State() 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : num_entries(0), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_offset(0), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) put_offset(0), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token(-1), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error(error::kNoError), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_lost_reason(error::kUnknown), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generation(0) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size of the command buffer in command buffer entries. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 num_entries; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The offset (in entries) from which the reader is reading. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 get_offset; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The offset (in entries) at which the writer is writing. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 put_offset; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current token value. This is used by the writer to defer 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes to shared memory objects until the reader has reached a certain 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // point in the command buffer. The reader is responsible for updating the 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // token value, for example in response to an asynchronous set token command 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // embedded in the command buffer. The default token value is zero. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 token; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error status. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error::Error error; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lost context detail information. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error::ContextLostReason context_lost_reason; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generation index of this state. The generation index is incremented every 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time a new state is retrieved from the command processor, so that 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consistency can be kept even if IPC messages are processed out-of-order. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 generation; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ConsoleMessage { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An user supplied id. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 id; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The message. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string message; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandBuffer() { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CommandBuffer() { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the command buffer with the given size. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Initialize() = 0; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current status. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual State GetState() = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the last state without synchronizing with the service. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual State GetLastState() = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the last token without synchronizing with the service. Note that 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // while you could just call GetLastState().token, GetLastState needs to be 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fast as it is called for every command where GetLastToken is only called 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by code that needs to know the last token so it can be slower but more up 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to date than GetLastState. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int32 GetLastToken() = 0; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The writer calls this to update its put offset. This ensures the reader 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sees the latest added commands, and will eventually process them. On the 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // service side, commands are processed up to the given put_offset before 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subsequent Flushes on the same GpuChannel. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Flush(int32 put_offset) = 0; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The writer calls this to update its put offset. This function returns the 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reader's most recent get offset. Does not return until all pending commands 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have been executed. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual State FlushSync(int32 put_offset, int32 last_known_get) = 0; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the buffer commands are read from. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also resets the get and put offsets to 0. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetGetBuffer(int32 transfer_buffer_id) = 0; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the current get offset. This can be called from any thread. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetGetOffset(int32 get_offset) = 0; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a transfer buffer of the given size. Returns its ID or -1 on 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // error. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Buffer CreateTransferBuffer(size_t size, int32* id) = 0; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destroy a transfer buffer. The ID must be positive. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DestroyTransferBuffer(int32 id) = 0; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the transfer buffer associated with an ID. Returns a null buffer for 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ID 0. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Buffer GetTransferBuffer(int32 id) = 0; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the reader to update the current token value. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetToken(int32 token) = 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the reader to set the current parse error. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetParseError(error::Error) = 0; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the reader to set the current context lost reason. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: if calling this in conjunction with SetParseError, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call this first. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetContextLostReason(error::ContextLostReason) = 0; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The NaCl Win64 build only really needs the struct definitions above; having 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetLastError declared would mean we'd have to also define it, and pull more 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of gpu in to the NaCl Win64 build. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NACL_WIN64) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(apatrick): this is a temporary optimization while skia is calling 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RendererGLContext::MakeCurrent prior to every GL call. It saves returning 6 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ints redundantly when only the error is needed for the CommandBufferProxy 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implementation. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual error::Error GetLastError(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CommandBuffer); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_COMMON_COMMAND_BUFFER_H_ 147