This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/gpu/intern/gpu_context_private.hh
Thomas Dinges cc8ea6ac67 Metal: MTLShader and MTLShaderGenerator implementation.
Full support for translation and compilation of shaders in Metal, using
GPUShaderCreateInfo. Includes render pipeline state creation and management,
enabling all standard GPU viewport rendering features in Metal.

Authored by Apple: Michael Parkin-White, Marco Giordano

Ref T96261

Reviewed By: fclem

Maniphest Tasks: T96261

Differential Revision: https://developer.blender.org/D15563
2022-09-01 22:28:40 +02:00

105 lines
2.8 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2016 by Mike Erwin. All rights reserved. */
/** \file
* \ingroup gpu
*
* This interface allow GPU to manage GL objects for multiple context and threads.
*/
#pragma once
#include "MEM_guardedalloc.h"
#include "GPU_context.h"
#include "gpu_debug_private.hh"
#include "gpu_framebuffer_private.hh"
#include "gpu_immediate_private.hh"
#include "gpu_shader_private.hh"
#include "gpu_state_private.hh"
#include <pthread.h>
struct GPUMatrixState;
namespace blender::gpu {
class Context {
public:
/** State management */
Shader *shader = nullptr;
FrameBuffer *active_fb = nullptr;
GPUMatrixState *matrix_state = nullptr;
StateManager *state_manager = nullptr;
Immediate *imm = nullptr;
/**
* All 4 window frame-buffers.
* None of them are valid in an off-screen context.
* Right frame-buffers are only available if using stereo rendering.
* Front frame-buffers contains (in principle, but not always) the last frame color.
* Default frame-buffer is back_left.
*/
FrameBuffer *back_left = nullptr;
FrameBuffer *front_left = nullptr;
FrameBuffer *back_right = nullptr;
FrameBuffer *front_right = nullptr;
DebugStack debug_stack;
/* GPUContext counter used to assign a unique ID to each GPUContext.
* NOTE(Metal): This is required by the Metal Backend, as a bug exists in the global OS shader
* cache wherein compilation of identical source from two distinct threads can result in an
* invalid cache collision, result in a broken shader object. Appending the unique context ID
* onto compiled sources ensures the source hashes are different. */
static int context_counter;
int context_id = 0;
protected:
/** Thread on which this context is active. */
pthread_t thread_;
bool is_active_;
/** Avoid including GHOST headers. Can be nullptr for off-screen contexts. */
void *ghost_window_;
public:
Context();
virtual ~Context();
static Context *get();
virtual void activate() = 0;
virtual void deactivate() = 0;
virtual void begin_frame() = 0;
virtual void end_frame() = 0;
/* Will push all pending commands to the GPU. */
virtual void flush() = 0;
/* Will wait until the GPU has finished executing all command. */
virtual void finish() = 0;
virtual void memory_statistics_get(int *total_mem, int *free_mem) = 0;
virtual void debug_group_begin(const char *, int){};
virtual void debug_group_end(){};
bool is_active_on_thread();
};
/* Syntactic sugar. */
static inline GPUContext *wrap(Context *ctx)
{
return reinterpret_cast<GPUContext *>(ctx);
}
static inline Context *unwrap(GPUContext *ctx)
{
return reinterpret_cast<Context *>(ctx);
}
static inline const Context *unwrap(const GPUContext *ctx)
{
return reinterpret_cast<const Context *>(ctx);
}
} // namespace blender::gpu