void OSystem_Android::initBackend() { ENTER(); _main_thread = pthread_self(); ConfMan.registerDefault("fullscreen", true); ConfMan.registerDefault("aspect_ratio", true); ConfMan.registerDefault("touchpad_mouse_mode", true); ConfMan.setInt("autosave_period", 0); ConfMan.setBool("FM_high_quality", false); ConfMan.setBool("FM_medium_quality", true); if (ConfMan.hasKey("touchpad_mouse_mode")) _touchpad_mode = ConfMan.getBool("touchpad_mouse_mode"); else ConfMan.setBool("touchpad_mouse_mode", true); // must happen before creating TimerManager to avoid race in // creating EventManager setupKeymapper(); // BUG: "transient" ConfMan settings get nuked by the options // screen. Passing the savepath in this way makes it stick // (via ConfMan.registerDefault) _savefileManager = new DefaultSaveFileManager(ConfMan.get("savepath")); _timerManager = new DefaultTimerManager(); gettimeofday(&_startTime, 0); _mixer = new Audio::MixerImpl(this, _audio_sample_rate); _mixer->setReady(true); _timer_thread_exit = false; pthread_create(&_timer_thread, 0, timerThreadFunc, this); _audio_thread_exit = false; pthread_create(&_audio_thread, 0, audioThreadFunc, this); initSurface(); initViewport(); _game_texture = new GLESFakePalette565Texture(); _overlay_texture = new GLES4444Texture(); _mouse_texture_palette = new GLESFakePalette5551Texture(); _mouse_texture = _mouse_texture_palette; initOverlay(); // renice this thread to boost the audio thread if (setpriority(PRIO_PROCESS, 0, 19) < 0) warning("couldn't renice the main thread"); JNI::setReadyForEvents(true); EventsBaseBackend::initBackend(); }
//create a specific size surface, used mainly by Image class bool Surface::create(Uint32 w, Uint32 h, int iAlpha /*=-1*/) { cleanUp(); //destroy any existing surface SDL_Surface *s; s = SDL_CreateRGBSurface(SCREEN_SURFACE|(iAlpha>=0)?SDL_SRCALPHA:SDL_SRCCOLORKEY, w, h, SCREEN_BPP, // 0, 0, 0, 0); #if SDL_BYTEORDER == SDL_BIG_ENDIAN 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); #else 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); #endif bool b = initSurface(s, iAlpha); return (b && _surface != NULL); }
bool WGLSwapchain::setup(const GraphicsSwapchainDesc& swapchainDesc) noexcept { if (!initSurface(swapchainDesc)) return false; if (!initPixelFormat(swapchainDesc)) return false; if (!initSwapchain(swapchainDesc)) return false; _swapchainDesc = swapchainDesc; return true; }
/** * Initializes the OpenGL context using EGL. */ bool EGLPlatform::initContext() { // if there is already a current context, destroy it first destroyContext(); // choose the default config for now int numConfigs = 1; EGLint attribute_list[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_NONE }; if(!eglChooseConfig(this->display, attribute_list, &this->config, 1, &numConfigs)) { printf("Choosing EGL config failed (error code: 0x%x)\n", eglGetError()); return false; } else if(numConfigs == 0) { printf("No matching EGL configs\n"); return false; } this->context = eglCreateContext(this->display, this->config, EGL_NO_CONTEXT, NULL); if(this->context == EGL_NO_CONTEXT) { printf("Error: creating OpenGL context failed (error code: 0x%x)\n", eglGetError()); return false; } #if USE_PBUFFER if(this->surface == EGL_NO_SURFACE) { if(!initSurface()) return false; } #endif return true; }
Error GrManagerImpl::initInternal(const GrManagerInitInfo& init) { ANKI_LOGI("Initializing Vulkan backend"); ANKI_CHECK(initInstance(init)); ANKI_CHECK(initSurface(init)); ANKI_CHECK(initDevice(init)); vkGetDeviceQueue(m_device, m_queueIdx, 0, &m_queue); ANKI_CHECK(initSwapchain(init)); { VkPipelineCacheCreateInfo ci = {}; ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; vkCreatePipelineCache(m_device, &ci, nullptr, &m_pplineCache); } ANKI_CHECK(initMemory(*init.m_config)); ANKI_CHECK(m_dsetAlloc.init(getAllocator(), m_device)); m_pplineLayFactory.init(getAllocator(), m_device, &m_dsetAlloc.getDescriptorSetLayoutFactory()); for(PerFrame& f : m_perFrame) { resetFrame(f); } glslang::InitializeProcess(); m_fences.init(getAllocator(), m_device); m_semaphores.init(getAllocator(), m_device); m_queryAlloc.init(getAllocator(), m_device); m_samplerCache = getAllocator().newInstance<GrObjectCache>(m_manager); // Set m_r8g8b8ImagesSupported { VkImageFormatProperties props = {}; VkResult res = vkGetPhysicalDeviceImageFormatProperties(m_physicalDevice, VK_FORMAT_R8G8B8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &props); if(res == VK_ERROR_FORMAT_NOT_SUPPORTED) { ANKI_LOGI("R8G8B8 Images are not supported. Will workaround this"); m_r8g8b8ImagesSupported = false; } else { ANKI_ASSERT(res == VK_SUCCESS); ANKI_LOGI("R8G8B8 Images are supported"); m_r8g8b8ImagesSupported = true; } } // Set m_s8ImagesSupported { VkImageFormatProperties props = {}; VkResult res = vkGetPhysicalDeviceImageFormatProperties(m_physicalDevice, VK_FORMAT_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &props); if(res == VK_ERROR_FORMAT_NOT_SUPPORTED) { ANKI_LOGI("S8 Images are not supported. Will workaround this"); m_s8ImagesSupported = false; } else { ANKI_ASSERT(res == VK_SUCCESS); ANKI_LOGI("S8 Images are supported"); m_s8ImagesSupported = true; } } // Set m_d24S8ImagesSupported { VkImageFormatProperties props = {}; VkResult res = vkGetPhysicalDeviceImageFormatProperties(m_physicalDevice, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &props); if(res == VK_ERROR_FORMAT_NOT_SUPPORTED) { ANKI_LOGI("D24S8 Images are not supported. Will workaround this"); m_d24S8ImagesSupported = false; } else { ANKI_ASSERT(res == VK_SUCCESS); ANKI_LOGI("D24S8 Images are supported"); m_d24S8ImagesSupported = true; } } return ErrorCode::NONE; }