/* * Copyright (C) 2017-2019 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "runtime/command_stream/device_command_stream.h" #include "runtime/os_interface/linux/drm_gem_close_worker.h" #include "drm/i915_drm.h" #include namespace NEO { class BufferObject; class Drm; class DrmMemoryManager; template class DrmCommandStreamReceiver : public DeviceCommandStreamReceiver { protected: typedef DeviceCommandStreamReceiver BaseClass; using CommandStreamReceiverHw::CommandStreamReceiver::getTagAddress; using BaseClass::getScratchPatchAddress; using BaseClass::makeNonResident; using BaseClass::makeResident; using BaseClass::mediaVfeStateDirty; using BaseClass::osContext; using BaseClass::requiredScratchSize; public: // When drm is null default implementation is used. In this case DrmCommandStreamReceiver is responsible to free drm. // When drm is passed, DCSR will not free it at destruction DrmCommandStreamReceiver(ExecutionEnvironment &executionEnvironment, gemCloseWorkerMode mode = gemCloseWorkerMode::gemCloseWorkerActive); FlushStamp flush(BatchBuffer &batchBuffer, ResidencyContainer &allocationsForResidency) override; void makeResident(GraphicsAllocation &gfxAllocation) override; void processResidency(ResidencyContainer &allocationsForResidency) override; void makeNonResident(GraphicsAllocation &gfxAllocation) override; bool waitForFlushStamp(FlushStamp &flushStampToWait) override; DrmMemoryManager *getMemoryManager() const; gemCloseWorkerMode peekGemCloseWorkerOperationMode() { return this->gemCloseWorkerOperationMode; } protected: void makeResident(BufferObject *bo); std::vector residency; std::vector execObjectsStorage; Drm *drm; gemCloseWorkerMode gemCloseWorkerOperationMode; }; } // namespace NEO