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