1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #pragma once 17 18 #include <pthread.h> 19 #include <ostream> 20 21 #include <log/log.h> 22 23 namespace android { 24 namespace uirenderer { 25 26 extern pthread_t gGpuThread; 27 28 #define ASSERT_GPU_THREAD() \ 29 LOG_ALWAYS_FATAL_IF(!pthread_equal(gGpuThread, pthread_self()), \ 30 "Error, %p of type %d (size=%d) used on wrong thread! cur thread %lu " \ 31 "!= gpu thread %lu", \ 32 this, static_cast<int>(mType), mSize, pthread_self(), gGpuThread) 33 34 enum class GpuObjectType { 35 Texture = 0, 36 OffscreenBuffer, 37 Layer, 38 39 TypeCount, 40 }; 41 42 class GpuMemoryTracker { 43 public: objectType()44 GpuObjectType objectType() { return mType; } objectSize()45 int objectSize() { return mSize; } 46 47 static void onGpuContextCreated(); 48 static void onGpuContextDestroyed(); 49 static void dump(); 50 static void dump(std::ostream& stream); 51 static int getInstanceCount(GpuObjectType type); 52 static int getTotalSize(GpuObjectType type); 53 static void onFrameCompleted(); 54 55 protected: GpuMemoryTracker(GpuObjectType type)56 explicit GpuMemoryTracker(GpuObjectType type) : mType(type) { 57 ASSERT_GPU_THREAD(); 58 startTrackingObject(); 59 } 60 ~GpuMemoryTracker()61 ~GpuMemoryTracker() { 62 notifySizeChanged(0); 63 stopTrackingObject(); 64 } 65 66 void notifySizeChanged(int newSize); 67 68 private: 69 void startTrackingObject(); 70 void stopTrackingObject(); 71 72 int mSize = 0; 73 GpuObjectType mType; 74 }; 75 76 } // namespace uirenderer 77 } // namespace android; 78