1 // 2 // Copyright 2014 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // Buffer9.cpp Defines the Buffer9 class. 8 9 #include "libGLESv2/renderer/d3d/d3d9/Buffer9.h" 10 #include "libGLESv2/renderer/d3d/d3d9/Renderer9.h" 11 #include "libGLESv2/main.h" 12 13 namespace rx 14 { 15 16 Buffer9::Buffer9(rx::Renderer9 *renderer) 17 : BufferD3D(), 18 mRenderer(renderer), 19 mSize(0) 20 {} 21 22 Buffer9::~Buffer9() 23 { 24 mSize = 0; 25 } 26 27 Buffer9 *Buffer9::makeBuffer9(BufferImpl *buffer) 28 { 29 ASSERT(HAS_DYNAMIC_TYPE(Buffer9*, buffer)); 30 return static_cast<Buffer9*>(buffer); 31 } 32 33 gl::Error Buffer9::setData(const void* data, size_t size, GLenum usage) 34 { 35 if (size > mMemory.size()) 36 { 37 if (!mMemory.resize(size)) 38 { 39 return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer."); 40 } 41 } 42 43 mSize = size; 44 if (data) 45 { 46 memcpy(mMemory.data(), data, size); 47 } 48 49 invalidateStaticData(); 50 51 if (usage == GL_STATIC_DRAW) 52 { 53 initializeStaticData(); 54 } 55 56 return gl::Error(GL_NO_ERROR); 57 } 58 59 void *Buffer9::getData() 60 { 61 return mMemory.data(); 62 } 63 64 gl::Error Buffer9::setSubData(const void* data, size_t size, size_t offset) 65 { 66 if (offset + size > mMemory.size()) 67 { 68 if (!mMemory.resize(offset + size)) 69 { 70 return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer."); 71 } 72 } 73 74 mSize = std::max(mSize, offset + size); 75 if (data) 76 { 77 memcpy(mMemory.data() + offset, data, size); 78 } 79 80 invalidateStaticData(); 81 82 return gl::Error(GL_NO_ERROR); 83 } 84 85 gl::Error Buffer9::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size) 86 { 87 // Note: this method is currently unreachable 88 Buffer9* sourceBuffer = makeBuffer9(source); 89 ASSERT(sourceBuffer); 90 91 memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size); 92 93 invalidateStaticData(); 94 95 return gl::Error(GL_NO_ERROR); 96 } 97 98 // We do not support buffer mapping in D3D9 99 gl::Error Buffer9::map(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) 100 { 101 UNREACHABLE(); 102 return gl::Error(GL_INVALID_OPERATION); 103 } 104 105 gl::Error Buffer9::unmap() 106 { 107 UNREACHABLE(); 108 return gl::Error(GL_INVALID_OPERATION); 109 } 110 111 void Buffer9::markTransformFeedbackUsage() 112 { 113 UNREACHABLE(); 114 } 115 116 Renderer* Buffer9::getRenderer() 117 { 118 return mRenderer; 119 } 120 121 } 122