Commit 4a22a5a0 authored by reveman@chromium.org's avatar reveman@chromium.org

gpu: Allow BufferData size=0 for pixel transfer buffer objects.

This makes it possible to release all shared memory used by a
pixel transfer buffer without destroying the Id.

BUG=163482
TEST=manual


Review URL: https://chromiumcodereview.appspot.com/11415223

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170776 0039d316-1c4b-4281-b951-d872f2087c98
parent a7d1c04d
...@@ -24,12 +24,15 @@ BufferTracker::~BufferTracker() { ...@@ -24,12 +24,15 @@ BufferTracker::~BufferTracker() {
BufferTracker::Buffer* BufferTracker::CreateBuffer( BufferTracker::Buffer* BufferTracker::CreateBuffer(
GLuint id, GLsizeiptr size) { GLuint id, GLsizeiptr size) {
GPU_DCHECK_NE(0u, id); GPU_DCHECK_NE(0u, id);
GPU_DCHECK_LT(0, size); GPU_DCHECK_LE(0, size);
int32 shm_id; int32 shm_id = -1;
uint32 shm_offset; uint32 shm_offset = 0;
void* address = mapped_memory_->Alloc(size, &shm_id, &shm_offset); void* address = NULL;
if (!address) { if (size) {
return NULL; address = mapped_memory_->Alloc(size, &shm_id, &shm_offset);
if (!address) {
return NULL;
}
} }
Buffer* buffer = new Buffer(id, size, shm_id, shm_offset, address); Buffer* buffer = new Buffer(id, size, shm_id, shm_offset, address);
...@@ -56,8 +59,8 @@ void BufferTracker::RemoveBuffer(GLuint client_id) { ...@@ -56,8 +59,8 @@ void BufferTracker::RemoveBuffer(GLuint client_id) {
} }
void BufferTracker::FreePendingToken(Buffer* buffer, int32 token) { void BufferTracker::FreePendingToken(Buffer* buffer, int32 token) {
GPU_DCHECK(buffer->address_); if (buffer->address_)
mapped_memory_->FreePendingToken(buffer->address_, token); mapped_memory_->FreePendingToken(buffer->address_, token);
buffer->size_ = 0; buffer->size_ = 0;
buffer->shm_id_ = 0; buffer->shm_id_ = 0;
buffer->shm_offset_ = 0; buffer->shm_offset_ = 0;
......
...@@ -70,5 +70,19 @@ TEST_F(BufferTrackerTest, Basic) { ...@@ -70,5 +70,19 @@ TEST_F(BufferTrackerTest, Basic) {
EXPECT_TRUE(buffer_tracker_->GetBuffer(kId1) == NULL); EXPECT_TRUE(buffer_tracker_->GetBuffer(kId1) == NULL);
} }
TEST_F(BufferTrackerTest, ZeroSize) {
const GLuint kId = 123;
// Check we can create a Buffer with zero size.
BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, 0);
ASSERT_TRUE(buffer != NULL);
// Check mapped memory address.
EXPECT_TRUE(buffer->address() == NULL);
// Check no shared memory was allocated.
EXPECT_EQ(0lu, mapped_memory_->num_chunks());
// Check we can delete the buffer.
buffer_tracker_->RemoveBuffer(kId);
}
} // namespace gles2 } // namespace gles2
} // namespace gpu } // namespace gpu
...@@ -1191,10 +1191,6 @@ void GLES2Implementation::ShaderSource( ...@@ -1191,10 +1191,6 @@ void GLES2Implementation::ShaderSource(
void GLES2Implementation::BufferDataHelper( void GLES2Implementation::BufferDataHelper(
GLenum target, GLsizeiptr size, const void* data, GLenum usage) { GLenum target, GLsizeiptr size, const void* data, GLenum usage) {
if (size == 0) {
return;
}
if (size < 0) { if (size < 0) {
SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0"); SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0");
return; return;
...@@ -1224,6 +1220,10 @@ void GLES2Implementation::BufferDataHelper( ...@@ -1224,6 +1220,10 @@ void GLES2Implementation::BufferDataHelper(
return; return;
} }
if (size == 0) {
return;
}
// If there is no data just send BufferData // If there is no data just send BufferData
if (!data) { if (!data) {
helper_->BufferData(target, size, 0, 0, usage); helper_->BufferData(target, size, 0, 0, usage);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment