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