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