浏览代码

use different context for rendering

/siyaoH-1.17-PlatformMessage
siyao 4 年前
当前提交
3f9b874e
共有 4 个文件被更改,包括 88 次插入45 次删除
  1. 5
      Samples/UIWidgetsSamples_2019_4/Assets/ANT.cs
  2. 2
      engine/src/shell/platform/unity/android/uiwidgets_panel.cc
  3. 125
      engine/src/shell/platform/unity/android/unity_surface_manager.cc
  4. 1
      engine/src/shell/platform/unity/android/unity_surface_manager.h

5
Samples/UIWidgetsSamples_2019_4/Assets/ANT.cs


// #if !UNITY_EDITOR
// // Pass texture pointer to the plugin
System.IntPtr ptr = SetTextureFromUnity2 (tex.GetNativeTexturePtr(), tex.width, tex.height);
GL.IssuePluginEvent(GetRenderEventFunc(), 1);
if (ptr != System.IntPtr.Zero)
{
var texEx = Texture2D.CreateExternalTexture(width, height, TextureFormat.BGRA32, false, true, ptr);

// Wait until all frame rendering is done
yield return new WaitForEndOfFrame();
#if !UNITY_EDITOR
GL.IssuePluginEvent(GetRenderEventFunc(), 1);
// draw_xxx();
// GL.IssuePluginEvent(GetRenderEventFunc(), 1);
draw_xxx();
#endif
}
}

2
engine/src/shell/platform/unity/android/uiwidgets_panel.cc


static void UNITY_INTERFACE_API OnRenderEvent(int eventID)
{
UnitySurfaceManager::drawxxx();
UnitySurfaceManager::SetUp();
}
// --------------------------------------------------------------------------

125
engine/src/shell/platform/unity/android/unity_surface_manager.cc


static EGLContext egl_context_s_old;
static GLenum state;
static bool inited = false;
static GLuint fbo_s = 0;
static EGLSurface read_s;
static EGLSurface draw_s;
void *UnitySurfaceManager::SetTextureFromUnity(void *tex, int w, int h)
{

return nullptr;
}
static void StoreOldCurrent(){
read_s = eglGetCurrentSurface(EGL_READ);
draw_s = eglGetCurrentSurface(EGL_DRAW);
egl_display_s = eglGetCurrentDisplay();
egl_context_s_old = eglGetCurrentContext(); //????? for get context
}
static bool RestoreOldCurrent() {
return eglMakeCurrent(egl_display_s, draw_s, read_s, egl_context_s_old) == GL_TRUE;
}
void UnitySurfaceManager::SetUp()
{
StoreOldCurrent();
GLuint gltex = (GLuint)(size_t)(g_TextureHandle);
// egl_display_s = eglGetDisplay(EGL_DEFAULT_DISPLAY);
// FML_CHECK(egl_display_s != EGL_NO_DISPLAY)
// << "Renderer type is invalid";

// << "Renderer type is invalid";
// bool success = false;
bool success = false;
// std::tie(success, egl_config_s) = ChooseEGLConfiguration(egl_display_s);
std::tie(success, egl_config_s) = ChooseEGLConfiguration(egl_display_s);
// EGLint attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
// egl_context_s = eglCreateContext(egl_display_s, egl_config_s, EGL_NO_CONTEXT, attributes);
EGLint attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
egl_context_s = eglCreateContext(egl_display_s, egl_config_s, egl_context_s_old, attributes);
return nullptr;
}
static void createContext()
{
if (egl_display_s != nullptr)
{
return;
}
egl_display_s = eglGetDisplay(EGL_DEFAULT_DISPLAY);
FML_CHECK(egl_display_s != EGL_NO_DISPLAY)
<< "Renderer type is invalid";
// Initialize the display connection.
FML_CHECK(eglInitialize(egl_display_s, nullptr, nullptr) == EGL_TRUE)
<< "Renderer type is invalid";
bool success = false;
std::tie(success, egl_config_s) = ChooseEGLConfiguration(egl_display_s);
FML_CHECK(success) << "Could not choose an EGL configuration.";
EGLint attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
egl_context_s_old = eglGetCurrentContext(); //????? for get context
egl_context_s = eglCreateContext(egl_display_s, egl_config_s, egl_context_s_old, attributes);
// auto read = eglGetCurrentSurface(EGL_READ);
// auto draw = eglGetCurrentSurface(EGL_DRAW);
// auto state = eglMakeCurrent(egl_display_s, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_context_s) == GL_TRUE;
auto state = eglMakeCurrent(egl_display_s, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_context_s) == GL_TRUE;
// unsigned int texture;
// glGenTextures(1, &texture);
// glBindTexture(GL_TEXTURE_2D, texture);

// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, wi, he, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
// state = glGetError();
GLint old_framebuffer_binding;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_framebuffer_binding);
// glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
// state = glGetError();
// state = eglMakeCurrent(egl_display_s, draw, read, egl_context_s_old) == GL_TRUE;
glGenFramebuffers(1, &fbo_s);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_s);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
gltex, 0);
FML_CHECK(glCheckFramebufferStatus(GL_FRAMEBUFFER) ==
GL_FRAMEBUFFER_COMPLETE);
glBindFramebuffer(GL_FRAMEBUFFER, old_framebuffer_binding);
// glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gltex, 0);
state = glGetError();
RestoreOldCurrent();
// return nullptr;
// static void createContext()
// {
// if (egl_display_s != nullptr)
// {
// return;
// }
// egl_display_s = eglGetDisplay(EGL_DEFAULT_DISPLAY);
// FML_CHECK(egl_display_s != EGL_NO_DISPLAY)
// << "Renderer type is invalid";
// // Initialize the display connection.
// FML_CHECK(eglInitialize(egl_display_s, nullptr, nullptr) == EGL_TRUE)
// << "Renderer type is invalid";
// bool success = false;
// std::tie(success, egl_config_s) = ChooseEGLConfiguration(egl_display_s);
// FML_CHECK(success) << "Could not choose an EGL configuration.";
// EGLint attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
// egl_context_s_old = eglGetCurrentContext(); //????? for get context
// egl_context_s = eglCreateContext(egl_display_s, egl_config_s, egl_context_s_old, attributes);
// }
static int siyao= 0;
createContext();
// createContext();
int width = wi;
int height = he;

unsigned char *dst = (unsigned char *)data;
siyao++;
for (int y = 0; y < height; ++y)
{

// Simple "plasma effect": several combined sine waves
int vv = 244;
int vv = (244 + siyao )%244;
ptr[1] = (x + y) % 244;
ptr[2] = (x * y) % 244;
ptr[1] = (x + y + siyao) % 244;
ptr[2] = (x * y * siyao) % 244;
ptr[3] = vv;
// To next pixel (our pixels are 4 bpp)

GLuint gltex = (GLuint)(size_t)(g_TextureHandle);
auto read = eglGetCurrentSurface(EGL_READ);
auto draw = eglGetCurrentSurface(EGL_DRAW);
auto dis = eglGetCurrentDisplay();
auto ctx = eglGetCurrentContext();
// glBegin(GL_LINES);
// glVertex2f(.25,0.25);
// glVertex2f(.75,.75);
// glEnd();
glClearColor(1, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
state = eglMakeCurrent(egl_display_s, draw, read, egl_context_s_old) == GL_TRUE;
// glClearColor(1.0, 0, 0, 1.0);
// glClear(GL_COLOR_BUFFER_BIT);
state = eglMakeCurrent(dis, draw, read, ctx) == GL_TRUE;
// state = eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_DISPLAY, EGL_NO_DISPLAY, EGL_NO_CONTEXT) == GL_TRUE;
// state = eglMakeCurrent(egl_display_s, draw_s, read_s, egl_context_s_old) == GL_TRUE;
// state = eglMakeCurrent(egl_display_s, EGL_NO_DISPLAY, EGL_NO_DISPLAY, egl_context_s_old) == GL_TRUE;
// state = eglMakeCurrent(egl_display_s, draw, read, egl_context_s_old) == GL_TRUE;
delete[](unsigned char *) data;
}

1
engine/src/shell/platform/unity/android/unity_surface_manager.h


public:
static UnitySurfaceManager instance;
static void* SetTextureFromUnity(void* tex, int w, int h);
static void SetUp();
static void drawxxx();
UnitySurfaceManager(IUnityInterfaces *unity_interfaces);

正在加载...
取消
保存