20#include "pedigree/kernel/Log.h"
21#include "pedigree/kernel/graphics/GraphicsService.h"
22#include "pedigree/kernel/machine/Display.h"
23#include "pedigree/kernel/process/TerminationDeferral.h"
24#include "pedigree/kernel/processor/Processor.h"
25#include "pedigree/kernel/processor/types.h"
26#include "pedigree/kernel/utilities/Iterator.h"
27#include "pedigree/kernel/utilities/String.h"
28#include "pedigree/kernel/utilities/utility.h"
34 bool mutating =
false;
51 if (mutating && !interruptsEnabled)
55 const bool lockAcquired =
63 bool alreadyRegistered =
false;
66 if (*it == pProvider) {
67 alreadyRegistered =
true;
72 if (!alreadyRegistered)
73 m_Providers.pushBack(pProvider);
76 m_pCurrentProvider = bestProvider.bestBase;
77 m_pCurrentTextProvider = bestProvider.bestText;
86 m_Providers.erase(it);
88 m_pCurrentProvider = bestProvider.bestBase;
89 m_pCurrentTextProvider = bestProvider.bestText;
95 params->providerFound =
false;
97 if (params->wantTextMode) {
98 if (m_pCurrentTextProvider) {
99 MemoryCopy(¶ms->providerResult, m_pCurrentTextProvider,
sizeof(
GraphicsProvider));
100 params->providerFound =
true;
103 }
else if (m_pCurrentProvider) {
104 MemoryCopy(¶ms->providerResult, m_pCurrentProvider,
sizeof(
GraphicsProvider));
105 params->providerFound =
true;
119 uint64_t bestPoints = 0;
120 uint64_t bestTextPoints = 0;
125 GraphicsProvider* pProvider = *it;
128 uint64_t textPoints = 0;
131 if (pProvider->bHardwareAccel)
133 (0x10000ULL * 0x10000ULL) * 32ULL;
136 points += pProvider->maxWidth * pProvider->maxHeight * pProvider->maxDepth;
137 textPoints += pProvider->maxTextWidth * pProvider->maxTextHeight;
139 if (!pProvider->bTextModes) {
144 pProvider->pDisplay->getName(name);
145 DEBUG_LOG(
"GraphicsService: provider with display name '"
146 << name <<
"' got " << points <<
" points (" << textPoints <<
" text points)");
149 const bool preferredClass =
150 result.bestBase && result.bestBase->bFirmwareFallback && !pProvider->bFirmwareFallback;
151 const bool sameClass =
152 !result.bestBase || result.bestBase->bFirmwareFallback == pProvider->bFirmwareFallback;
153 if (preferredClass || (sameClass && points > bestPoints)) {
155 result.bestBase = pProvider;
157 DEBUG_LOG(
" => new best provider");
160 if (textPoints > bestTextPoints) {
161 bestTextPoints = textPoints;
162 result.bestText = pProvider;
164 DEBUG_LOG(
" => new best text provider");
bool serve(ServiceFeatures::Type type, void *pData, size_t dataLen)
::Iterator< T, node_t > Iterator
static bool getInterrupts()
bool tryAcquire(size_t n=1)
bool acquire(size_t n=1, size_t timeoutSecs=0, size_t timeoutUsecs=0)