10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License. 50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at 60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software 100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and 130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License. 140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#ifndef sw_Resource_hpp 160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define sw_Resource_hpp 170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "MutexLock.hpp" 190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace sw 210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens enum Accessor 230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PUBLIC, // Application/API access 250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens PRIVATE, // Renderer access, shared by multiple threads if read-only 260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens MANAGED, // Renderer access, shared read/write access if partitioned 27bf7a8145635e7dc6625596be127733ac7418cf21Nicolas Capens EXCLUSIVE 280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens class Resource 310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens public: 330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Resource(size_t bytes); 340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void destruct(); // Asynchronous destructor 360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void *lock(Accessor claimer); 380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void *lock(Accessor relinquisher, Accessor claimer); 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void unlock(); 400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void unlock(Accessor relinquisher); 410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const void *data() const; 430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const size_t size; 440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens private: 460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ~Resource(); // Always call destruct() instead 470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 48f8faed6dd2b2389bef3b9aae0f5ce9e8fcf950faJorge E. Moreira MutexLock criticalSection; 490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Event unblock; 500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens volatile int blocked; 510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens volatile Accessor accessor; 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens volatile int count; 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens bool orphaned; 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void *buffer; 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens} 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif // sw_Resource_hpp 61