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 "libANGLE/renderer/d3d/d3d9/Buffer9.h"
10 #include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
11 
12 namespace rx
13 {
14 
Buffer9(const gl::BufferState & state,Renderer9 * renderer)15 Buffer9::Buffer9(const gl::BufferState &state, Renderer9 *renderer)
16     : BufferD3D(state, renderer), mSize(0)
17 {
18 }
19 
~Buffer9()20 Buffer9::~Buffer9()
21 {
22     mSize = 0;
23 }
24 
getSize() const25 size_t Buffer9::getSize() const
26 {
27     return mSize;
28 }
29 
supportsDirectBinding() const30 bool Buffer9::supportsDirectBinding() const
31 {
32     return false;
33 }
34 
setData(const gl::Context * context,gl::BufferBinding,const void * data,size_t size,gl::BufferUsage usage)35 gl::Error Buffer9::setData(const gl::Context *context,
36                            gl::BufferBinding /*target*/,
37                            const void *data,
38                            size_t size,
39                            gl::BufferUsage usage)
40 {
41     if (size > mMemory.size())
42     {
43         if (!mMemory.resize(size))
44         {
45             return gl::OutOfMemory() << "Failed to resize internal buffer.";
46         }
47     }
48 
49     mSize = size;
50     if (data && size > 0)
51     {
52         memcpy(mMemory.data(), data, size);
53     }
54 
55     updateD3DBufferUsage(context, usage);
56 
57     invalidateStaticData(context);
58 
59     return gl::NoError();
60 }
61 
getData(const gl::Context * context,const uint8_t ** outData)62 gl::Error Buffer9::getData(const gl::Context *context, const uint8_t **outData)
63 {
64     *outData = mMemory.data();
65     return gl::NoError();
66 }
67 
setSubData(const gl::Context * context,gl::BufferBinding,const void * data,size_t size,size_t offset)68 gl::Error Buffer9::setSubData(const gl::Context *context,
69                               gl::BufferBinding /*target*/,
70                               const void *data,
71                               size_t size,
72                               size_t offset)
73 {
74     if (offset + size > mMemory.size())
75     {
76         if (!mMemory.resize(offset + size))
77         {
78             return gl::OutOfMemory() << "Failed to resize internal buffer.";
79         }
80     }
81 
82     mSize = std::max(mSize, offset + size);
83     if (data && size > 0)
84     {
85         memcpy(mMemory.data() + offset, data, size);
86     }
87 
88     invalidateStaticData(context);
89 
90     return gl::NoError();
91 }
92 
copySubData(const gl::Context * context,BufferImpl * source,GLintptr sourceOffset,GLintptr destOffset,GLsizeiptr size)93 gl::Error Buffer9::copySubData(const gl::Context *context,
94                                BufferImpl *source,
95                                GLintptr sourceOffset,
96                                GLintptr destOffset,
97                                GLsizeiptr size)
98 {
99     // Note: this method is currently unreachable
100     Buffer9 *sourceBuffer = GetAs<Buffer9>(source);
101     ASSERT(sourceBuffer);
102 
103     memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size);
104 
105     invalidateStaticData(context);
106 
107     return gl::NoError();
108 }
109 
110 // We do not support buffer mapping in D3D9
map(const gl::Context * context,GLenum access,void ** mapPtr)111 gl::Error Buffer9::map(const gl::Context *context, GLenum access, void **mapPtr)
112 {
113     UNREACHABLE();
114     return gl::InternalError();
115 }
116 
mapRange(const gl::Context * context,size_t offset,size_t length,GLbitfield access,void ** mapPtr)117 gl::Error Buffer9::mapRange(const gl::Context *context,
118                             size_t offset,
119                             size_t length,
120                             GLbitfield access,
121                             void **mapPtr)
122 {
123     UNREACHABLE();
124     return gl::InternalError();
125 }
126 
unmap(const gl::Context * context,GLboolean * result)127 gl::Error Buffer9::unmap(const gl::Context *context, GLboolean *result)
128 {
129     UNREACHABLE();
130     return gl::InternalError();
131 }
132 
markTransformFeedbackUsage(const gl::Context * context)133 gl::Error Buffer9::markTransformFeedbackUsage(const gl::Context *context)
134 {
135     UNREACHABLE();
136     return gl::InternalError();
137 }
138 
139 }  // namespace rx
140