1d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// 2d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// Copyright 2014 The ANGLE Project Authors. All rights reserved. 3d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// Use of this source code is governed by a BSD-style license that can be 4d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// found in the LICENSE file. 5d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// 6d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 7d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// Buffer9.cpp Defines the Buffer9 class. 8d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 9d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones#include "libGLESv2/renderer/d3d/d3d9/Buffer9.h" 10d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h" 110b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include "libGLESv2/main.h" 12d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 13d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jonesnamespace rx 14d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 15d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 16d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesBuffer9::Buffer9(rx::Renderer9 *renderer) 17d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones : BufferD3D(), 18d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones mRenderer(renderer), 19d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones mSize(0) 205c1e58d044616ba1b083dd44a2db3c3edb9890ebJamie Madill{} 21d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 22d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesBuffer9::~Buffer9() 23d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 245c1e58d044616ba1b083dd44a2db3c3edb9890ebJamie Madill mSize = 0; 25d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 26d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 27d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesBuffer9 *Buffer9::makeBuffer9(BufferImpl *buffer) 28d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 29d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones ASSERT(HAS_DYNAMIC_TYPE(Buffer9*, buffer)); 30d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones return static_cast<Buffer9*>(buffer); 31d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 32d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 332a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::setData(const void* data, size_t size, GLenum usage) 34d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 35d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones if (size > mMemory.size()) 36d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones { 375063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang if (!mMemory.resize(size)) 385063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang { 392a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer."); 405063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang } 41d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones } 42d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 43d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones mSize = size; 44d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones if (data) 45d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones { 46d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones memcpy(mMemory.data(), data, size); 47d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones } 48d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 49d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones invalidateStaticData(); 50d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 51d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones if (usage == GL_STATIC_DRAW) 52d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones { 53d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones initializeStaticData(); 54d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones } 552a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang 562a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang return gl::Error(GL_NO_ERROR); 57d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 58d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 59d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jonesvoid *Buffer9::getData() 60d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 61d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones return mMemory.data(); 62d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 63d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 642a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::setSubData(const void* data, size_t size, size_t offset) 65d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 66d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones if (offset + size > mMemory.size()) 67d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones { 685063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang if (!mMemory.resize(offset + size)) 695063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang { 702a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer."); 715063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang } 72d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones } 73d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 74d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones mSize = std::max(mSize, offset + size); 75d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones if (data) 76d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones { 77d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones memcpy(mMemory.data() + offset, data, size); 78d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones } 79d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 80d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones invalidateStaticData(); 812a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang 822a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang return gl::Error(GL_NO_ERROR); 83d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 84d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 852a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size) 86d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 87cfaaf72fbd4b791c6eed6932e3e1e8741fd25d91Jamie Madill // Note: this method is currently unreachable 88d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones Buffer9* sourceBuffer = makeBuffer9(source); 892a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang ASSERT(sourceBuffer); 902a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang 912a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size); 92d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 93d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones invalidateStaticData(); 942a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang 952a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang return gl::Error(GL_NO_ERROR); 96d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 97d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 982a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang// We do not support buffer mapping in D3D9 992a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::map(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) 100d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 101d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones UNREACHABLE(); 1022a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang return gl::Error(GL_INVALID_OPERATION); 103d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 104d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 1052a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::unmap() 106d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 107d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones UNREACHABLE(); 1082a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang return gl::Error(GL_INVALID_OPERATION); 109d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 110d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 111d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jonesvoid Buffer9::markTransformFeedbackUsage() 112d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 113d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones UNREACHABLE(); 114d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 115d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 116d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesRenderer* Buffer9::getRenderer() 117d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{ 118d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones return mRenderer; 119d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 120d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones 121d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones} 122