Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Unified Diff: gpu/command_buffer/client/gles2_implementation.h

Issue 8536045: Make command buffer free transfer buffer when switching tabs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/build_gles2_cmd_buffer.py ('k') | gpu/command_buffer/client/gles2_implementation.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/client/gles2_implementation.h
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index e085efc518455e8e954795629adcb14c88c4701e..82739b40d911b9b5ed43e299727e26c0a368923b 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -76,6 +76,7 @@ namespace gles2 {
class ClientSideBufferHelper;
class ProgramInfoManager;
+class AlignedRingBuffer;
// Base class for IdHandlers
class IdHandlerInterface {
@@ -93,6 +94,83 @@ class IdHandlerInterface {
virtual bool MarkAsUsedForBind(GLuint id) = 0;
};
+// Wraps RingBufferWrapper to provide aligned allocations.
+class AlignedRingBuffer : public RingBufferWrapper {
+ public:
+ AlignedRingBuffer(
+ unsigned int alignment,
+ int32 shm_id,
+ RingBuffer::Offset base_offset,
+ unsigned int size,
+ CommandBufferHelper* helper,
+ void* base)
+ : RingBufferWrapper(base_offset, size, helper, base),
+ alignment_(alignment),
+ shm_id_(shm_id) {
+ }
+ ~AlignedRingBuffer();
+
+ // Overrriden from RingBufferWrapper
+ void* Alloc(unsigned int size) {
+ return RingBufferWrapper::Alloc(RoundToAlignment(size));
+ }
+
+ template <typename T>T* AllocTyped(unsigned int count) {
+ return static_cast<T*>(Alloc(count * sizeof(T)));
+ }
+
+ int32 GetShmId() const {
+ return shm_id_;
+ }
+
+ private:
+ unsigned int RoundToAlignment(unsigned int size) {
+ return (size + alignment_ - 1) & ~(alignment_ - 1);
+ }
+
+ unsigned int alignment_;
+ int32 shm_id_;
+};
+
+// Manages the transfer buffer.
+class TransferBuffer {
+ public:
+ TransferBuffer(
+ CommandBufferHelper* helper,
+ int32 buffer_id,
+ void* buffer,
+ size_t buffer_size,
+ size_t result_size,
+ unsigned int alignment);
+ ~TransferBuffer();
+
+ AlignedRingBuffer* GetBuffer();
+ int GetShmId();
+ void* GetResultBuffer();
+ int GetResultOffset();
+
+ void Free();
+
+ // This is for unit testing only.
+ bool HaveBuffer() const {
+ return buffer_id_ != 0;
+ }
+
+ private:
+ void AllocateRingBuffer();
+
+ void Setup(int32 buffer_id, void* buffer);
+
+ CommandBufferHelper* helper_;
+ scoped_ptr<AlignedRingBuffer> ring_buffer_;
+ unsigned int buffer_size_;
+ unsigned int result_size_;
+ unsigned int alignment_;
+ int32 buffer_id_;
+ void* result_buffer_;
+ uint32 result_shm_offset_;
+};
+
// This class emulates GLES2 over command buffers. It can be used by a client
// program so that the program does not need deal with shared memory and command
// buffer management. See gl2_lib.h. Note that there is a performance gain to
@@ -200,6 +278,7 @@ class GLES2Implementation {
void SetSharedMemoryChunkSizeMultiple(unsigned int multiple);
void FreeUnusedSharedMemory();
+ void FreeEverything();
private:
// Used to track whether an extension is available
@@ -209,31 +288,6 @@ class GLES2Implementation {
kUnknownExtensionStatus
};
- // Wraps RingBufferWrapper to provide aligned allocations.
- class AlignedRingBuffer : public RingBufferWrapper {
- public:
- AlignedRingBuffer(RingBuffer::Offset base_offset,
- unsigned int size,
- CommandBufferHelper *helper,
- void *base)
- : RingBufferWrapper(base_offset, size, helper, base) {
- }
-
- static unsigned int RoundToAlignment(unsigned int size) {
- return (size + kAlignment - 1) & ~(kAlignment - 1);
- }
-
- // Overrriden from RingBufferWrapper
- void *Alloc(unsigned int size) {
- return RingBufferWrapper::Alloc(RoundToAlignment(size));
- }
-
- // Overrriden from RingBufferWrapper
- template <typename T> T *AllocTyped(unsigned int count) {
- return static_cast<T *>(Alloc(count * sizeof(T)));
- }
- };
-
// Base class for mapped resources.
struct MappedResource {
MappedResource(GLenum _access, int _shm_id, void* mem, unsigned int offset)
@@ -329,20 +383,18 @@ class GLES2Implementation {
GLuint bound_texture_cube_map;
};
- // Gets the shared memory id for the result buffer.
- uint32 result_shm_id() const {
- return transfer_buffer_id_;
+ // Gets the value of the result.
+ template <typename T>
+ T GetResultAs() {
+ return static_cast<T>(transfer_buffer_.GetResultBuffer());
}
- // Gets the shared memory offset for the result buffer.
- uint32 result_shm_offset() const {
- return result_shm_offset_;
+ int32 GetResultShmId() {
+ return transfer_buffer_.GetShmId();
}
- // Gets the value of the result.
- template <typename T>
- T GetResultAs() const {
- return static_cast<T>(result_buffer_);
+ uint32 GetResultShmOffset() {
+ return transfer_buffer_.GetResultOffset();
}
// Lazily determines if GL_ANGLE_pack_reverse_row_order is available
@@ -433,10 +485,7 @@ class GLES2Implementation {
GLES2Util util_;
GLES2CmdHelper* helper_;
scoped_ptr<IdHandlerInterface> id_handlers_[id_namespaces::kNumIdNamespaces];
- AlignedRingBuffer transfer_buffer_;
- int transfer_buffer_id_;
- void* result_buffer_;
- uint32 result_shm_offset_;
+ TransferBuffer transfer_buffer_;
std::string last_error_;
std::queue<int32> swap_buffers_tokens_;
« no previous file with comments | « gpu/command_buffer/build_gles2_cmd_buffer.py ('k') | gpu/command_buffer/client/gles2_implementation.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698