1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program EGL Module
3 * ---------------------------------------
5 * Copyright 2014 The Android Open Source Project
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief EGL gles2 sharing threaded tests
22 *//*--------------------------------------------------------------------*/
24 #include "teglGLES2SharingThreadedTests.hpp"
26 #include "tcuTestLog.hpp"
27 #include "tcuThreadUtil.hpp"
29 #include "deRandom.hpp"
30 #include "deThread.hpp"
31 #include "deSharedPtr.hpp"
32 #include "deMutex.hpp"
33 #include "deSemaphore.hpp"
34 #include "deStringUtil.hpp"
41 #include "gluDefs.hpp"
43 #include "glwEnums.hpp"
44 #include "glwFunctions.hpp"
46 #include "egluUtil.hpp"
48 #include "eglwLibrary.hpp"
49 #include "eglwEnums.hpp"
68 namespace GLES2ThreadTest
75 class GLES2ResourceManager
79 SharedPtr<Texture> popTexture (int index);
80 const SharedPtr<Texture> getTexture (int index) const { return m_textures[index]; }
81 void addTexture (SharedPtr<Texture> texture) { m_textures.push_back(texture); }
82 int getTextureCount (void) const { return (int)m_textures.size(); }
84 SharedPtr<Buffer> popBuffer (int index);
85 const SharedPtr<Buffer> getBuffer (int index) const { return m_buffers[index]; }
86 void addBuffer (SharedPtr<Buffer> buffer) { m_buffers.push_back(buffer); }
87 int getBufferCount (void) const { return (int)m_buffers.size(); }
89 SharedPtr<Shader> popShader (int index);
90 const SharedPtr<Shader> getShader (int index) const { return m_shaders[index]; }
91 void addShader (SharedPtr<Shader> shader) { m_shaders.push_back(shader); }
92 int getShaderCount (void) const { return (int)m_shaders.size(); }
94 SharedPtr<Program> popProgram (int index);
95 const SharedPtr<Program> getProgram (int index) const { return m_programs[index]; }
96 void addProgram (SharedPtr<Program> program) { m_programs.push_back(program); }
97 int getProgramCount (void) const { return (int)m_programs.size(); }
100 std::vector<SharedPtr<Texture> > m_textures;
101 std::vector<SharedPtr<Buffer> > m_buffers;
102 std::vector<SharedPtr<Shader> > m_shaders;
103 std::vector<SharedPtr<Program> > m_programs;
106 SharedPtr<Texture> GLES2ResourceManager::popTexture (int index)
108 SharedPtr<Texture> texture = m_textures[index];
110 m_textures.erase(m_textures.begin() + index);
115 SharedPtr<Buffer> GLES2ResourceManager::popBuffer (int index)
117 SharedPtr<Buffer> buffer = m_buffers[index];
119 m_buffers.erase(m_buffers.begin() + index);
124 SharedPtr<Shader> GLES2ResourceManager::popShader (int index)
126 SharedPtr<Shader> shader = m_shaders[index];
128 m_shaders.erase(m_shaders.begin() + index);
133 SharedPtr<Program> GLES2ResourceManager::popProgram (int index)
135 SharedPtr<Program> program = m_programs[index];
137 m_programs.erase(m_programs.begin() + index);
142 class GLES2Context : public tcu::ThreadUtil::Object
145 GLES2Context (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<GLES2ResourceManager> resourceManager);
146 ~GLES2Context (void);
148 // Call generation time attributes
149 SharedPtr<GLES2ResourceManager> resourceManager;
151 // Run time attributes
157 glEGLImageTargetTexture2DOESFunc imageTargetTexture2D;
160 GLES2Context (const GLES2Context&);
161 GLES2Context& operator= (const GLES2Context&);
164 GLES2Context::GLES2Context (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<GLES2ResourceManager> resourceManager_)
165 : tcu::ThreadUtil::Object ("Context", event)
166 , resourceManager (resourceManager_)
167 , display (EGL_NO_DISPLAY)
168 , context (EGL_NO_CONTEXT)
170 glExtensions.imageTargetTexture2D = DE_NULL;
173 GLES2Context::~GLES2Context (void)
177 class Surface : public tcu::ThreadUtil::Object
180 Surface (SharedPtr<tcu::ThreadUtil::Event> event);
183 // Run time attributes
187 Surface (const Surface&);
188 Surface& operator= (const Surface&);
191 Surface::Surface (SharedPtr<tcu::ThreadUtil::Event> event)
192 : tcu::ThreadUtil::Object ("Surface", event)
193 , surface (EGL_NO_SURFACE)
197 Surface::~Surface (void)
201 // EGL thread with thread specifig state
202 class EGLThread : public tcu::ThreadUtil::Thread
205 EGLThread (const Library& egl_, const glw::Functions& gl_, int seed);
207 virtual void deinit (void);
210 const glw::Functions& gl;
212 // Generation time attributes
213 SharedPtr<GLES2Context> context;
214 SharedPtr<Surface> surface;
216 // Runtime attributes
218 SharedPtr<GLES2Context> runtimeContext;
219 EGLSurface eglSurface;
223 EGLThread::EGLThread (const Library& egl_, const glw::Functions& gl_, int seed)
224 : tcu::ThreadUtil::Thread (seed)
227 , eglSurface (EGL_NO_SURFACE)
231 void EGLThread::deinit (void)
235 if (runtimeContext->context != EGL_NO_CONTEXT)
236 egl.makeCurrent(runtimeContext->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
238 egl.destroyContext(runtimeContext->display, runtimeContext->context);
239 runtimeContext->context = EGL_NO_CONTEXT;
241 egl.destroySurface(runtimeContext->display, eglSurface);
242 eglSurface = EGL_NO_SURFACE;
248 EGLThread::~EGLThread (void)
259 void init (EGLThread& thread, bool serverSync);
260 bool waitReady (EGLThread& thread);
262 void addWaiter (void);
265 EGLDisplay m_display;
272 FenceSync::FenceSync (void)
273 : m_display (EGL_NO_DISPLAY)
276 , m_serverSync (false)
280 FenceSync::~FenceSync (void)
284 void FenceSync::addWaiter (void)
291 void FenceSync::init (EGLThread& thread, bool serverSync)
293 m_display = thread.runtimeContext->display;
294 m_serverSync = serverSync;
296 // Use sync only if somebody will actualy depend on it
298 if (m_waiterCount > 0)
300 thread.newMessage() << "Begin -- eglCreateSyncKHR(" << ((size_t)m_display) << ", EGL_SYNC_FENCE_KHR, DE_NULL)" << tcu::ThreadUtil::Message::End;
301 m_sync = thread.egl.createSyncKHR(m_display, EGL_SYNC_FENCE_KHR, DE_NULL);
302 thread.newMessage() << "End -- " << ((size_t)m_sync) << " = eglCreateSyncKHR()" << tcu::ThreadUtil::Message::End;
308 bool FenceSync::waitReady (EGLThread& thread)
313 thread.newMessage() << "Begin -- eglWaitSyncKHR(" << ((size_t)m_display) << ", " << ((size_t)m_sync) << ", 0)" << tcu::ThreadUtil::Message::End;
314 EGLint result = thread.egl.waitSyncKHR(m_display, m_sync, 0);
315 thread.newMessage() << "End -- " << result << " = eglWaitSyncKHR()" << tcu::ThreadUtil::Message::End;
316 ok = result == EGL_TRUE;
320 thread.newMessage() << "Begin -- eglClientWaitSyncKHR(" << ((size_t)m_display) << ", " << ((size_t)m_sync) << ", EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 1000 000 000)" << tcu::ThreadUtil::Message::End;
321 EGLint result = thread.egl.clientWaitSyncKHR(m_display, m_sync, EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 1000000000);
322 thread.newMessage() << "End -- " << result << " = eglClientWaitSyncKHR()" << tcu::ThreadUtil::Message::End;
323 ok = result == EGL_CONDITION_SATISFIED_KHR;
328 DE_ASSERT(m_waiterCount >= 0);
330 if (m_waiterCount == 0)
332 // \note [mika] This is no longer deterministic and eglDestroySyncKHR might happen in different places and in different threads
333 thread.newMessage() << "Begin -- eglDestroySyncKHR(" << ((size_t)m_display) << ", " << ((size_t)m_sync) << ")" << tcu::ThreadUtil::Message::End;
334 EGLint destroyResult = thread.egl.destroySyncKHR(m_display, m_sync);
335 thread.newMessage() << "End -- " << destroyResult << " = eglDestroySyncKHR()" << tcu::ThreadUtil::Message::End;
344 class Object : public tcu::ThreadUtil::Object
347 Object (const char* type, SharedPtr<tcu::ThreadUtil::Event> e, SharedPtr<FenceSync> sync);
350 void readGL (SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps);
351 void modifyGL (SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps);
354 SharedPtr<FenceSync> m_modifySync;
355 vector<SharedPtr<FenceSync> > m_readSyncs;
358 Object::Object (const char* type, SharedPtr<tcu::ThreadUtil::Event> e, SharedPtr<FenceSync> sync)
359 : tcu::ThreadUtil::Object (type, e)
360 , m_modifySync (sync)
364 Object::~Object (void)
368 void Object::readGL (SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps)
371 m_modifySync->addWaiter();
373 // Make call depend on last modifying call
374 deps.push_back(m_modifySync);
376 // Add read dependency
377 m_readSyncs.push_back(sync);
380 void Object::modifyGL (SharedPtr<FenceSync> sync, std::vector<SharedPtr<FenceSync> >& deps)
382 // Make call depend on all reads
383 for (int readNdx = 0; readNdx < (int)m_readSyncs.size(); readNdx++)
385 if (m_readSyncs[readNdx])
386 m_readSyncs[readNdx]->addWaiter();
388 deps.push_back(m_readSyncs[readNdx]);
392 m_modifySync->addWaiter();
394 deps.push_back(m_modifySync);
396 // Update last modifying call
399 // Clear read dependencies of last "version" of this object
403 class Operation : public tcu::ThreadUtil::Operation
406 Operation (const char* name, bool useSync, bool serverSync);
407 virtual ~Operation (void);
409 SharedPtr<FenceSync> getSync (void) { return m_sync; }
410 void readGLObject (SharedPtr<Object> object);
411 void modifyGLObject (SharedPtr<Object> object);
413 virtual void execute (tcu::ThreadUtil::Thread& thread);
418 std::vector<SharedPtr<FenceSync> > m_syncDeps;
419 SharedPtr<FenceSync> m_sync;
422 Operation::Operation (const char* name, bool useSync, bool serverSync)
423 : tcu::ThreadUtil::Operation (name)
424 , m_useSync (useSync)
425 , m_serverSync (serverSync)
426 , m_sync (useSync ? SharedPtr<FenceSync>(new FenceSync()) : SharedPtr<FenceSync>())
430 Operation::~Operation (void)
434 void Operation::readGLObject (SharedPtr<Object> object)
436 object->read(m_event, m_deps);
437 object->readGL(m_sync, m_syncDeps);
440 void Operation::modifyGLObject (SharedPtr<Object> object)
442 object->modify(m_event, m_deps);
443 object->modifyGL(m_sync, m_syncDeps);
446 void Operation::execute (tcu::ThreadUtil::Thread& t)
448 EGLThread& thread = dynamic_cast<EGLThread&>(t);
452 // Wait for dependencies and check that they succeeded
453 for (int depNdx = 0; depNdx < (int)m_deps.size(); depNdx++)
455 if (!m_deps[depNdx]->waitReady())
459 // Try execute operation
466 for (int depNdx = 0; depNdx < (int)m_syncDeps.size(); depNdx++)
468 EGLThread* eglThread = dynamic_cast<EGLThread*>(&thread);
469 DE_ASSERT(eglThread);
470 if (m_syncDeps[depNdx]->waitReady(*eglThread) != tcu::ThreadUtil::Event::RESULT_OK)
483 EGLThread* eglThread = dynamic_cast<EGLThread*>(&thread);
484 DE_ASSERT(eglThread);
485 m_sync->init(*eglThread, m_serverSync);
486 thread.newMessage() << "Begin -- glFlush()" << tcu::ThreadUtil::Message::End;
487 GLU_CHECK_GLW_CALL(thread.gl, flush());
488 thread.newMessage() << "End -- glFlush()" << tcu::ThreadUtil::Message::End;
492 thread.newMessage() << "Begin -- glFinish()" << tcu::ThreadUtil::Message::End;
493 GLU_CHECK_GLW_CALL(thread.gl, finish());
494 thread.newMessage() << "End -- glFinish()" << tcu::ThreadUtil::Message::End;
500 // Got exception event failed
501 m_event->setResult(tcu::ThreadUtil::Event::RESULT_FAILED);
507 m_event->setResult(tcu::ThreadUtil::Event::RESULT_OK);
509 m_event->setResult(tcu::ThreadUtil::Event::RESULT_FAILED);
512 m_event = SharedPtr<tcu::ThreadUtil::Event>();
514 m_sync = SharedPtr<FenceSync>();
517 class EGLImage : public Object
520 EGLImage (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
521 virtual ~EGLImage (void) {}
526 // EGLResource manager
527 class EGLResourceManager
531 void addContext (SharedPtr<GLES2Context> context) { m_contexts.push_back(context); }
532 void addSurface (SharedPtr<Surface> surface) { m_surfaces.push_back(surface); }
533 void addImage (SharedPtr<EGLImage> image) { m_images.push_back(image); }
535 SharedPtr<Surface> popSurface (int index);
536 SharedPtr<GLES2Context> popContext (int index);
537 SharedPtr<EGLImage> popImage (int index);
539 int getContextCount (void) const { return (int)m_contexts.size(); }
540 int getSurfaceCount (void) const { return (int)m_surfaces.size(); }
541 int getImageCount (void) const { return (int)m_images.size(); }
544 std::vector<SharedPtr<GLES2Context> > m_contexts;
545 std::vector<SharedPtr<Surface> > m_surfaces;
546 std::vector<SharedPtr<EGLImage> > m_images;
549 SharedPtr<Surface> EGLResourceManager::popSurface (int index)
551 SharedPtr<Surface> surface = m_surfaces[index];
552 m_surfaces.erase(m_surfaces.begin() + index);
556 SharedPtr<GLES2Context> EGLResourceManager::popContext (int index)
558 SharedPtr<GLES2Context> context = m_contexts[index];
559 m_contexts.erase(m_contexts.begin() + index);
563 SharedPtr<EGLImage> EGLResourceManager::popImage (int index)
565 SharedPtr<EGLImage> image = m_images[index];
566 m_images.erase(m_images.begin() + index);
570 class CreateContext : public tcu::ThreadUtil::Operation
573 CreateContext (EGLDisplay display, EGLConfig config, SharedPtr<GLES2Context> shared, SharedPtr<GLES2Context>& context);
575 void exec (tcu::ThreadUtil::Thread& thread);
578 EGLDisplay m_display;
580 SharedPtr<GLES2Context> m_shared;
581 SharedPtr<GLES2Context> m_context;
584 CreateContext::CreateContext (EGLDisplay display, EGLConfig config, SharedPtr<GLES2Context> shared, SharedPtr<GLES2Context>& context)
585 : tcu::ThreadUtil::Operation ("CreateContext")
586 , m_display (display)
591 modifyObject(SharedPtr<tcu::ThreadUtil::Object>(shared));
593 context = SharedPtr<GLES2Context>(new GLES2Context(getEvent(), (shared ? shared->resourceManager : SharedPtr<GLES2ResourceManager>(new GLES2ResourceManager))));
597 void CreateContext::exec (tcu::ThreadUtil::Thread& t)
599 EGLThread& thread = dynamic_cast<EGLThread&>(t);
600 m_context->display = m_display;
602 const EGLint attriblist[] =
604 EGL_CONTEXT_CLIENT_VERSION, 2,
608 thread.newMessage() << "Begin -- eglBindAPI(EGL_OPENGL_ES_API)" << tcu::ThreadUtil::Message::End;
609 EGLU_CHECK_CALL(thread.egl, bindAPI(EGL_OPENGL_ES_API));
610 thread.newMessage() << "End -- eglBindAPI()" << tcu::ThreadUtil::Message::End;
614 DE_ASSERT(m_shared->context != EGL_NO_CONTEXT);
615 DE_ASSERT(m_shared->display != EGL_NO_DISPLAY);
616 DE_ASSERT(m_shared->display == m_display);
618 thread.newMessage() << "Begin -- eglCreateContext(" << m_display << ", " << m_config << ", " << m_shared->context << ", { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE })" << tcu::ThreadUtil::Message::End;
619 m_context->context = thread.egl.createContext(m_display, m_config, m_shared->context, attriblist);
620 thread.newMessage() << "End -- " << m_context->context << " = eglCreateContext()" << tcu::ThreadUtil::Message::End;
624 thread.newMessage() << "Begin -- eglCreateContext(" << m_display << ", " << m_config << ", EGL_NO_CONTEXT, { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE })" << tcu::ThreadUtil::Message::End;
625 m_context->context = thread.egl.createContext(m_display, m_config, EGL_NO_CONTEXT, attriblist);
626 thread.newMessage() << "End -- " << m_context->context << " = eglCreateContext()" << tcu::ThreadUtil::Message::End;
629 EGLU_CHECK_MSG(thread.egl, "Failed to create GLES2 context");
630 TCU_CHECK(m_context->context != EGL_NO_CONTEXT);
633 class DestroyContext : public tcu::ThreadUtil::Operation
636 DestroyContext (SharedPtr<GLES2Context> contex);
637 void exec (tcu::ThreadUtil::Thread& thread);
640 SharedPtr<GLES2Context> m_context;
643 DestroyContext::DestroyContext (SharedPtr<GLES2Context> contex)
644 : tcu::ThreadUtil::Operation ("DestroyContext")
647 modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_context));
650 void DestroyContext::exec (tcu::ThreadUtil::Thread& t)
652 EGLThread& thread = dynamic_cast<EGLThread&>(t);
654 thread.newMessage() << "Begin -- eglDestroyContext(" << m_context->display << ", " << m_context->context << ")" << tcu::ThreadUtil::Message::End;
655 EGLU_CHECK_CALL(thread.egl, destroyContext(m_context->display, m_context->context));
656 thread.newMessage() << "End -- eglDestroyContext()" << tcu::ThreadUtil::Message::End;
657 m_context->display = EGL_NO_DISPLAY;
658 m_context->context = EGL_NO_CONTEXT;
661 class MakeCurrent : public tcu::ThreadUtil::Operation
664 MakeCurrent (EGLThread& thread, EGLDisplay display, SharedPtr<Surface> surface, SharedPtr<GLES2Context> context);
666 void exec (tcu::ThreadUtil::Thread& thread);
669 EGLDisplay m_display;
670 SharedPtr<Surface> m_surface;
671 SharedPtr<GLES2Context> m_context;
674 MakeCurrent::MakeCurrent (EGLThread& thread, EGLDisplay display, SharedPtr<Surface> surface, SharedPtr<GLES2Context> context)
675 : tcu::ThreadUtil::Operation ("MakeCurrent")
676 , m_display (display)
677 , m_surface (surface)
678 , m_context (context)
681 modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_context));
684 modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_surface));
686 // Release old contexts
689 modifyObject(SharedPtr<tcu::ThreadUtil::Object>(thread.context));
692 // Release old surface
695 modifyObject(SharedPtr<tcu::ThreadUtil::Object>(thread.surface));
698 thread.context = m_context;
699 thread.surface = m_surface;
702 void MakeCurrent::exec (tcu::ThreadUtil::Thread& t)
704 EGLThread& thread = dynamic_cast<EGLThread&>(t);
708 thread.eglSurface = m_surface->surface;
709 thread.runtimeContext = m_context;
711 DE_ASSERT(m_surface);
712 thread.newMessage() << "Begin -- eglMakeCurrent(" << m_display << ", " << m_surface->surface << ", " << m_surface->surface << ", " << m_context->context << ")" << tcu::ThreadUtil::Message::End;
713 EGLU_CHECK_CALL(thread.egl, makeCurrent(m_display, m_surface->surface, m_surface->surface, m_context->context));
714 thread.newMessage() << "End -- eglMakeCurrent()" << tcu::ThreadUtil::Message::End;
718 thread.runtimeContext = m_context;
720 thread.newMessage() << "Begin -- eglMakeCurrent(" << m_display << ", EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)" << tcu::ThreadUtil::Message::End;
721 EGLU_CHECK_CALL(thread.egl, makeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
722 thread.newMessage() << "End -- eglMakeCurrent()" << tcu::ThreadUtil::Message::End;
726 class InitGLExtension : public tcu::ThreadUtil::Operation
729 InitGLExtension (const char* extension);
731 void exec (tcu::ThreadUtil::Thread& thread);
734 std::string m_extension;
737 InitGLExtension::InitGLExtension (const char* extension)
738 : tcu::ThreadUtil::Operation ("InitGLExtension")
739 , m_extension (extension)
743 void InitGLExtension::exec (tcu::ThreadUtil::Thread& t)
745 EGLThread& thread = dynamic_cast<EGLThread&>(t);
750 thread.newMessage() << "Begin -- glGetString(GL_EXTENSIONS)" << tcu::ThreadUtil::Message::End;
751 std::string extensions = (const char*)thread.gl.getString(GL_EXTENSIONS);
752 thread.newMessage() << "End -- glGetString()" << tcu::ThreadUtil::Message::End;
754 std::string::size_type pos = extensions.find(" ");
758 std::string extension;
759 if (pos != std::string::npos)
761 extension = extensions.substr(0, pos);
762 extensions = extensions.substr(pos+1);
766 extension = extensions;
770 if (extension == m_extension)
775 pos = extensions.find(" ");
776 } while (pos != std::string::npos);
779 throw tcu::NotSupportedError((m_extension + " not supported").c_str(), "", __FILE__, __LINE__);
782 // Query function pointers
783 if (m_extension == "GL_OES_EGL_image")
785 thread.newMessage() << "Begin -- eglGetProcAddress(\"glEGLImageTargetTexture2DOES\")" << tcu::ThreadUtil::Message::End;
786 thread.runtimeContext->glExtensions.imageTargetTexture2D = (glEGLImageTargetTexture2DOESFunc)thread.egl.getProcAddress("glEGLImageTargetTexture2DOES");
787 thread.newMessage() << "End -- " << ((void*)thread.runtimeContext->glExtensions.imageTargetTexture2D) << " = eglGetProcAddress()"<< tcu::ThreadUtil::Message::End;
791 class CreatePBufferSurface : public tcu::ThreadUtil::Operation
794 CreatePBufferSurface (EGLDisplay display, EGLConfig config, EGLint width, EGLint height, SharedPtr<Surface>& surface);
795 void exec (tcu::ThreadUtil::Thread& thread);
798 EGLDisplay m_display;
802 SharedPtr<Surface> m_surface;
805 CreatePBufferSurface::CreatePBufferSurface (EGLDisplay display, EGLConfig config, EGLint width, EGLint height, SharedPtr<Surface>& surface)
806 : tcu::ThreadUtil::Operation ("CreatePBufferSurface")
807 , m_display (display)
812 surface = SharedPtr<Surface>(new Surface(getEvent()));
816 void CreatePBufferSurface::exec (tcu::ThreadUtil::Thread& t)
818 EGLThread& thread = dynamic_cast<EGLThread&>(t);
820 const EGLint attriblist[] = {
822 EGL_HEIGHT, m_height,
826 thread.newMessage() << "Begin -- eglCreatePbufferSurface(" << m_display << ", " << m_config << ", { EGL_WIDTH, " << m_width << ", EGL_HEIGHT, " << m_height << ", EGL_NONE })" << tcu::ThreadUtil::Message::End;
827 m_surface->surface = thread.egl.createPbufferSurface(m_display, m_config, attriblist);
828 thread.newMessage() << "End -- " << m_surface->surface << "= eglCreatePbufferSurface()" << tcu::ThreadUtil::Message::End;
829 EGLU_CHECK_MSG(thread.egl, "eglCreatePbufferSurface()");
832 class DestroySurface : public tcu::ThreadUtil::Operation
835 DestroySurface (EGLDisplay display, SharedPtr<Surface> surface);
836 void exec (tcu::ThreadUtil::Thread& thread);
839 EGLDisplay m_display;
840 SharedPtr<Surface> m_surface;
843 DestroySurface::DestroySurface (EGLDisplay display, SharedPtr<Surface> surface)
844 : tcu::ThreadUtil::Operation ("DestroySurface")
845 , m_display (display)
846 , m_surface (surface)
848 modifyObject(SharedPtr<tcu::ThreadUtil::Object>(m_surface));
851 void DestroySurface::exec (tcu::ThreadUtil::Thread& t)
853 EGLThread& thread = dynamic_cast<EGLThread&>(t);
855 thread.newMessage() << "Begin -- eglDestroySurface(" << m_display << ", " << m_surface->surface << ")" << tcu::ThreadUtil::Message::End;
856 EGLU_CHECK_CALL(thread.egl, destroySurface(m_display, m_surface->surface));
857 thread.newMessage() << "End -- eglDestroySurface()" << tcu::ThreadUtil::Message::End;
860 EGLImage::EGLImage (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
861 : Object ("EGLImage", event, sync)
862 , image (EGL_NO_IMAGE_KHR)
866 class Texture : public Object
869 Texture (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
871 // Runtime parameters
874 // Call generation time parameters
877 SharedPtr<EGLImage> sourceImage;
880 Texture::Texture (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
881 : Object ("Texture", event, sync)
887 class CreateTexture : public Operation
890 CreateTexture (SharedPtr<Texture>& texture, bool useSync, bool serverSync);
891 void exec (tcu::ThreadUtil::Thread& thread);
894 SharedPtr<Texture> m_texture;
897 CreateTexture::CreateTexture (SharedPtr<Texture>& texture, bool useSync, bool serverSync)
898 : Operation ("CreateTexture", useSync, serverSync)
900 texture = SharedPtr<Texture>(new Texture(getEvent(), getSync()));
904 void CreateTexture::exec (tcu::ThreadUtil::Thread& t)
906 EGLThread& thread = dynamic_cast<EGLThread&>(t);
909 thread.newMessage() << "Begin -- glGenTextures(1, { 0 })" << tcu::ThreadUtil::Message::End;
910 GLU_CHECK_GLW_CALL(thread.gl, genTextures(1, &tex));
911 thread.newMessage() << "End -- glGenTextures(1, { " << tex << " })" << tcu::ThreadUtil::Message::End;
913 m_texture->texture = tex;
916 class DeleteTexture : public Operation
919 DeleteTexture (SharedPtr<Texture> texture, bool useSync, bool serverSync);
920 void exec (tcu::ThreadUtil::Thread& thread);
923 SharedPtr<Texture> m_texture;
926 DeleteTexture::DeleteTexture (SharedPtr<Texture> texture, bool useSync, bool serverSync)
927 : Operation ("DeleteTexture", useSync, serverSync)
928 , m_texture (texture)
930 modifyGLObject(SharedPtr<Object>(m_texture));
933 void DeleteTexture::exec (tcu::ThreadUtil::Thread& t)
935 EGLThread& thread = dynamic_cast<EGLThread&>(t);
936 GLuint tex = m_texture->texture;
938 thread.newMessage() << "Begin -- glDeleteTextures(1, { " << tex << " })" << tcu::ThreadUtil::Message::End;
939 GLU_CHECK_GLW_CALL(thread.gl, deleteTextures(1, &tex));
940 thread.newMessage() << "End -- glDeleteTextures()" << tcu::ThreadUtil::Message::End;
942 m_texture->texture = 0;
945 class TexImage2D : public Operation
948 TexImage2D (SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync);
949 void exec (tcu::ThreadUtil::Thread& thread);
952 SharedPtr<Texture> m_texture;
954 GLint m_internalFormat;
961 TexImage2D::TexImage2D (SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync)
962 : Operation ("TexImage2D", useSync, serverSync)
963 , m_texture (texture)
965 , m_internalFormat (internalFormat)
971 modifyGLObject(SharedPtr<Object>(m_texture));
972 m_texture->isDefined = true;
975 texture->sourceImage = SharedPtr<EGLImage>();
978 void TexImage2D::exec (tcu::ThreadUtil::Thread& t)
980 EGLThread& thread = dynamic_cast<EGLThread&>(t);
981 void* dummyData = thread.getDummyData(m_width*m_height*4);
983 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
984 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
985 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
987 thread.newMessage() << "Begin -- glTexImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_internalFormat << ", " << m_width << ", " << m_height << ", 0, " << m_format << ", " << m_type << ", data)" << tcu::ThreadUtil::Message::End;
988 GLU_CHECK_GLW_CALL(thread.gl, texImage2D(GL_TEXTURE_2D, m_level, m_internalFormat, m_width, m_height, 0, m_format, m_type, dummyData));
989 thread.newMessage() << "End -- glTexImage2D()" << tcu::ThreadUtil::Message::End;
991 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
992 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
993 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
996 class TexSubImage2D : public Operation
999 TexSubImage2D (SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync);
1000 void exec (tcu::ThreadUtil::Thread& thread);
1003 SharedPtr<Texture> m_texture;
1013 TexSubImage2D::TexSubImage2D (SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, bool useSync, bool serverSync)
1014 : Operation ("TexSubImage2D", useSync, serverSync)
1015 , m_texture (texture)
1017 , m_xoffset (xoffset)
1018 , m_yoffset (yoffset)
1024 modifyGLObject(SharedPtr<Object>(m_texture));
1026 if (m_texture->sourceImage)
1027 modifyGLObject(SharedPtr<Object>(m_texture->sourceImage));
1030 void TexSubImage2D::exec (tcu::ThreadUtil::Thread& t)
1032 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1033 void* dummyData = thread.getDummyData(m_width*m_height*4);
1035 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
1036 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
1037 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1039 thread.newMessage() << "Begin -- glTexSubImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_xoffset << ", " << m_yoffset << ", " << m_width << ", " << m_height << ", 0, " << m_format << ", " << m_type << ", <data>)" << tcu::ThreadUtil::Message::End;
1040 GLU_CHECK_GLW_CALL(thread.gl, texSubImage2D(GL_TEXTURE_2D, m_level, m_xoffset, m_yoffset, m_width, m_height, m_format, m_type, dummyData));
1041 thread.newMessage() << "End -- glSubTexImage2D()" << tcu::ThreadUtil::Message::End;
1043 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
1044 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
1045 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1048 class CopyTexImage2D : public Operation
1051 CopyTexImage2D (SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border, bool useSync, bool serverSync);
1052 void exec (tcu::ThreadUtil::Thread& thread);
1055 SharedPtr<Texture> m_texture;
1057 GLint m_internalFormat;
1065 CopyTexImage2D::CopyTexImage2D (SharedPtr<Texture> texture, GLint level, GLint internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border, bool useSync, bool serverSync)
1066 : Operation ("CopyTexImage2D", useSync, serverSync)
1067 , m_texture (texture)
1069 , m_internalFormat (internalFormat)
1076 modifyGLObject(SharedPtr<Object>(m_texture));
1077 texture->isDefined = true;
1080 texture->sourceImage = SharedPtr<EGLImage>();
1083 void CopyTexImage2D::exec (tcu::ThreadUtil::Thread& t)
1085 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1087 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
1088 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
1089 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1091 thread.newMessage() << "Begin -- glCopyTexImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_internalFormat << ", " << m_x << ", " << m_y << ", " << m_width << ", " << m_height << ", " << m_border << ")" << tcu::ThreadUtil::Message::End;
1092 GLU_CHECK_GLW_CALL(thread.gl, copyTexImage2D(GL_TEXTURE_2D, m_level, m_internalFormat, m_x, m_y, m_width, m_height, m_border));
1093 thread.newMessage() << "End -- glCopyTexImage2D()" << tcu::ThreadUtil::Message::End;
1095 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
1096 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
1097 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1100 class CopyTexSubImage2D : public Operation
1103 CopyTexSubImage2D (SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, bool useSync, bool serverSync);
1104 void exec (tcu::ThreadUtil::Thread& thread);
1107 SharedPtr<Texture> m_texture;
1117 CopyTexSubImage2D::CopyTexSubImage2D (SharedPtr<Texture> texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, bool useSync, bool serverSync)
1118 : Operation ("CopyTexSubImage2D", useSync, serverSync)
1119 , m_texture (texture)
1121 , m_xoffset (xoffset)
1122 , m_yoffset (yoffset)
1128 modifyGLObject(SharedPtr<Object>(m_texture));
1130 if (m_texture->sourceImage)
1131 modifyGLObject(SharedPtr<Object>(m_texture->sourceImage));
1134 void CopyTexSubImage2D::exec (tcu::ThreadUtil::Thread& t)
1136 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1138 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
1139 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
1140 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1142 thread.newMessage() << "Begin -- glCopyTexSubImage2D(GL_TEXTURE_2D, " << m_level << ", " << m_xoffset << ", " << m_yoffset << ", " << m_x << ", " << m_y << ", " << m_width << ", " << m_height << ")" << tcu::ThreadUtil::Message::End;
1143 GLU_CHECK_GLW_CALL(thread.gl, copyTexSubImage2D(GL_TEXTURE_2D, m_level, m_xoffset, m_yoffset, m_x, m_y, m_width, m_height));
1144 thread.newMessage() << "End -- glCopyTexSubImage2D()" << tcu::ThreadUtil::Message::End;
1146 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
1147 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
1148 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1151 class Buffer : public Object
1154 Buffer (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
1156 // Runtime attributes
1160 // Call generation time parameters
1164 Buffer::Buffer (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
1165 : Object ("Buffer", event, sync)
1172 class CreateBuffer : public Operation
1175 CreateBuffer (SharedPtr<Buffer>& buffer, bool useSync, bool serverSync);
1176 void exec (tcu::ThreadUtil::Thread& thread);
1179 SharedPtr<Buffer> m_buffer;
1182 CreateBuffer::CreateBuffer (SharedPtr<Buffer>& buffer, bool useSync, bool serverSync)
1183 : Operation ("CreateBuffer", useSync, serverSync)
1185 buffer = SharedPtr<Buffer>(new Buffer(getEvent(), getSync()));
1189 void CreateBuffer::exec (tcu::ThreadUtil::Thread& t)
1191 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1194 thread.newMessage() << "Begin -- glGenBuffers(1, { 0 })" << tcu::ThreadUtil::Message::End;
1195 GLU_CHECK_GLW_CALL(thread.gl, genBuffers(1, &buffer));
1196 thread.newMessage() << "End -- glGenBuffers(1, { " << buffer << " })" << tcu::ThreadUtil::Message::End;
1198 m_buffer->buffer = buffer;
1201 class DeleteBuffer : public Operation
1204 DeleteBuffer (SharedPtr<Buffer> buffer, bool useSync, bool serverSync);
1205 void exec (tcu::ThreadUtil::Thread& thread);
1208 SharedPtr<Buffer> m_buffer;
1211 DeleteBuffer::DeleteBuffer (SharedPtr<Buffer> buffer, bool useSync, bool serverSync)
1212 : Operation ("DeleteBuffer", useSync, serverSync)
1215 modifyGLObject(SharedPtr<Object>(m_buffer));
1218 void DeleteBuffer::exec (tcu::ThreadUtil::Thread& t)
1220 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1221 GLuint buffer = m_buffer->buffer;
1223 thread.newMessage() << "Begin -- glDeleteBuffers(1, { " << buffer << " })" << tcu::ThreadUtil::Message::End;
1224 GLU_CHECK_GLW_CALL(thread.gl, deleteBuffers(1, &buffer));
1225 thread.newMessage() << "End -- glDeleteBuffers()" << tcu::ThreadUtil::Message::End;
1227 m_buffer->buffer = 0;
1230 class BufferData : public Operation
1233 BufferData (SharedPtr<Buffer> buffer, GLenum target, GLsizeiptr size, GLenum usage, bool useSync, bool serverSync);
1234 void exec (tcu::ThreadUtil::Thread& thread);
1237 SharedPtr<Buffer> m_buffer;
1243 BufferData::BufferData (SharedPtr<Buffer> buffer, GLenum target, GLsizeiptr size, GLenum usage, bool useSync, bool serverSync)
1244 : Operation ("BufferData", useSync, serverSync)
1250 modifyGLObject(SharedPtr<Object>(m_buffer));
1251 buffer->isDefined = true;
1252 buffer->size = size;
1255 void BufferData::exec (tcu::ThreadUtil::Thread& t)
1257 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1258 void* dummyData = thread.getDummyData(m_size);
1260 thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", " << m_buffer->buffer << ")" << tcu::ThreadUtil::Message::End;
1261 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, m_buffer->buffer));
1262 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1264 thread.newMessage() << "Begin -- glBufferData(" << m_target << ", " << m_size << ", <DATA>, " << m_usage << ")" << tcu::ThreadUtil::Message::End;
1265 GLU_CHECK_GLW_CALL(thread.gl, bufferData(m_target, m_size, dummyData, m_usage));
1266 thread.newMessage() << "End -- glBufferData()" << tcu::ThreadUtil::Message::End;
1268 thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", 0)" << tcu::ThreadUtil::Message::End;
1269 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, 0));
1270 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1273 class BufferSubData : public Operation
1276 BufferSubData (SharedPtr<Buffer> buffer, GLenum target, GLintptr offset, GLsizeiptr size, bool useSync, bool serverSync);
1277 void exec (tcu::ThreadUtil::Thread& thread);
1280 SharedPtr<Buffer> m_buffer;
1286 BufferSubData::BufferSubData (SharedPtr<Buffer> buffer, GLenum target, GLintptr offset, GLsizeiptr size, bool useSync, bool serverSync)
1287 : Operation ("BufferSubData", useSync, serverSync)
1293 modifyGLObject(SharedPtr<Object>(m_buffer));
1296 void BufferSubData::exec (tcu::ThreadUtil::Thread& t)
1298 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1299 void* dummyData = thread.getDummyData(m_size);
1301 thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", " << m_buffer->buffer << ")" << tcu::ThreadUtil::Message::End;
1302 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, m_buffer->buffer));
1303 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1305 thread.newMessage() << "Begin -- glBufferSubData(" << m_target << ", " << m_offset << ", " << m_size << ", <DATA>)" << tcu::ThreadUtil::Message::End;
1306 GLU_CHECK_GLW_CALL(thread.gl, bufferSubData(m_target, m_offset, m_size, dummyData));
1307 thread.newMessage() << "End -- glBufferSubData()" << tcu::ThreadUtil::Message::End;
1309 thread.newMessage() << "Begin -- glBindBuffer(" << m_target << ", 0)" << tcu::ThreadUtil::Message::End;
1310 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(m_target, 0));
1311 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1314 class Shader : public Object
1317 Shader (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
1325 Shader::Shader (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
1326 : Object ("Shader", event, sync)
1334 class CreateShader : public Operation
1337 CreateShader (GLenum type, SharedPtr<Shader>& shader, bool useSync, bool serverSync);
1338 void exec (tcu::ThreadUtil::Thread& thread);
1341 SharedPtr<Shader> m_shader;
1345 CreateShader::CreateShader (GLenum type, SharedPtr<Shader>& shader, bool useSync, bool serverSync)
1346 : Operation ("CreateShader", useSync, serverSync)
1349 shader = SharedPtr<Shader>(new Shader(getEvent(), getSync()));
1350 shader->type = type;
1355 void CreateShader::exec (tcu::ThreadUtil::Thread& t)
1357 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1360 thread.newMessage() << "Begin -- glCreateShader(" << m_type << ")" << tcu::ThreadUtil::Message::End;
1361 shader = thread.gl.createShader(m_type);
1362 GLU_CHECK_GLW_MSG(thread.gl, "glCreateShader()");
1363 thread.newMessage() << "End -- " << shader << " = glCreateShader(" << m_type << ")" << tcu::ThreadUtil::Message::End;
1365 m_shader->shader = shader;
1368 class DeleteShader : public Operation
1371 DeleteShader (SharedPtr<Shader> shader, bool useSync, bool serverSync);
1372 void exec (tcu::ThreadUtil::Thread& thread);
1375 SharedPtr<Shader> m_shader;
1378 DeleteShader::DeleteShader (SharedPtr<Shader> shader, bool useSync, bool serverSync)
1379 : Operation ("DeleteShader", useSync, serverSync)
1382 modifyGLObject(SharedPtr<Object>(m_shader));
1385 void DeleteShader::exec (tcu::ThreadUtil::Thread& t)
1387 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1388 GLuint shader = m_shader->shader;
1390 thread.newMessage() << "Begin -- glDeleteShader(" << shader << ")" << tcu::ThreadUtil::Message::End;
1391 GLU_CHECK_GLW_CALL(thread.gl, deleteShader(shader));
1392 thread.newMessage() << "End -- glDeleteShader()" << tcu::ThreadUtil::Message::End;
1394 m_shader->shader = 0;
1397 class ShaderSource : public Operation
1400 ShaderSource (SharedPtr<Shader> sharder, const char* source, bool useSync, bool serverSync);
1401 void exec (tcu::ThreadUtil::Thread& thread);
1404 SharedPtr<Shader> m_shader;
1408 ShaderSource::ShaderSource (SharedPtr<Shader> shader, const char* source, bool useSync, bool serverSync)
1409 : Operation ("ShaderSource", useSync, serverSync)
1413 modifyGLObject(SharedPtr<Object>(m_shader));
1414 m_shader->isDefined = true;
1417 void ShaderSource::exec (tcu::ThreadUtil::Thread& t)
1419 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1420 const char* shaderSource = m_source.c_str();
1422 thread.newMessage() << "Begin -- glShaderSource(" << m_shader->shader << ", 1, \"" << shaderSource << "\", DE_NULL)" << tcu::ThreadUtil::Message::End;
1423 GLU_CHECK_GLW_CALL(thread.gl, shaderSource(m_shader->shader, 1, &shaderSource, DE_NULL));
1424 thread.newMessage() << "End -- glShaderSource()" << tcu::ThreadUtil::Message::End;
1427 class ShaderCompile : public Operation
1430 ShaderCompile (SharedPtr<Shader> sharder, bool useSync, bool serverSync);
1431 void exec (tcu::ThreadUtil::Thread& thread);
1434 SharedPtr<Shader> m_shader;
1437 ShaderCompile::ShaderCompile (SharedPtr<Shader> shader, bool useSync, bool serverSync)
1438 : Operation ("ShaderCompile", useSync, serverSync)
1441 m_shader->compiled = true;
1442 modifyGLObject(SharedPtr<Object>(m_shader));
1445 void ShaderCompile::exec (tcu::ThreadUtil::Thread& t)
1447 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1449 thread.newMessage() << "Begin -- glCompileShader(" << m_shader->shader << ")" << tcu::ThreadUtil::Message::End;
1450 GLU_CHECK_GLW_CALL(thread.gl, compileShader(m_shader->shader));
1451 thread.newMessage() << "End -- glCompileShader()" << tcu::ThreadUtil::Message::End;
1454 class Program : public Object
1457 Program (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync);
1459 // Generation time attributes
1460 SharedPtr<Shader> vertexShader;
1461 SharedPtr<Shader> fragmentShader;
1464 // Runtime attributes
1466 GLuint runtimeVertexShader;
1467 GLuint runtimeFragmentShader;
1470 Program::Program (SharedPtr<tcu::ThreadUtil::Event> event, SharedPtr<FenceSync> sync)
1471 : Object ("Program", event, sync)
1474 , runtimeVertexShader (0)
1475 , runtimeFragmentShader (0)
1479 class CreateProgram : public Operation
1482 CreateProgram (SharedPtr<Program>& program, bool useSync, bool serverSync);
1483 void exec (tcu::ThreadUtil::Thread& thread);
1486 SharedPtr<Program> m_program;
1489 CreateProgram::CreateProgram (SharedPtr<Program>& program, bool useSync, bool serverSync)
1490 : Operation ("CreateProgram", useSync, serverSync)
1492 program = SharedPtr<Program>(new Program(getEvent(), getSync()));
1493 m_program = program;
1496 void CreateProgram::exec (tcu::ThreadUtil::Thread& t)
1498 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1501 thread.newMessage() << "Begin -- glCreateProgram()" << tcu::ThreadUtil::Message::End;
1502 program = thread.gl.createProgram();
1503 GLU_CHECK_GLW_MSG(thread.gl, "glCreateProgram()");
1504 thread.newMessage() << "End -- " << program << " = glCreateProgram()" << tcu::ThreadUtil::Message::End;
1506 m_program->program = program;
1509 class DeleteProgram : public Operation
1512 DeleteProgram (SharedPtr<Program> program, bool useSync, bool serverSync);
1513 void exec (tcu::ThreadUtil::Thread& thread);
1516 SharedPtr<Program> m_program;
1519 DeleteProgram::DeleteProgram (SharedPtr<Program> program, bool useSync, bool serverSync)
1520 : Operation ("DeleteProgram", useSync, serverSync)
1521 , m_program (program)
1523 modifyGLObject(SharedPtr<Object>(m_program));
1526 void DeleteProgram::exec (tcu::ThreadUtil::Thread& t)
1528 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1529 GLuint program = m_program->program;
1531 thread.newMessage() << "Begin -- glDeleteProgram(" << program << ")" << tcu::ThreadUtil::Message::End;
1532 GLU_CHECK_GLW_CALL(thread.gl, deleteProgram(program));
1533 thread.newMessage() << "End -- glDeleteProgram()" << tcu::ThreadUtil::Message::End;
1535 m_program->program = 0;
1538 class AttachShader : public Operation
1541 AttachShader (SharedPtr<Program> sharder, SharedPtr<Shader> shader, bool useSync, bool serverSync);
1542 void exec (tcu::ThreadUtil::Thread& thread);
1545 SharedPtr<Program> m_program;
1546 SharedPtr<Shader> m_shader;
1549 AttachShader::AttachShader (SharedPtr<Program> program, SharedPtr<Shader> shader, bool useSync, bool serverSync)
1550 : Operation ("AttachShader", useSync, serverSync)
1551 , m_program (program)
1554 modifyGLObject(SharedPtr<Object>(m_program));
1555 readGLObject(SharedPtr<Object>(m_shader));
1557 if (m_shader->type == GL_VERTEX_SHADER)
1558 m_program->vertexShader = shader;
1559 else if (m_shader->type == GL_FRAGMENT_SHADER)
1560 m_program->fragmentShader = shader;
1565 void AttachShader::exec (tcu::ThreadUtil::Thread& t)
1567 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1569 thread.newMessage() << "Begin -- glAttachShader(" << m_program->program << ", " << m_shader->shader << ")" << tcu::ThreadUtil::Message::End;
1570 GLU_CHECK_GLW_CALL(thread.gl, attachShader(m_program->program, m_shader->shader));
1571 thread.newMessage() << "End -- glAttachShader()" << tcu::ThreadUtil::Message::End;
1573 if (m_shader->type == GL_VERTEX_SHADER)
1574 m_program->runtimeVertexShader = m_shader->shader;
1575 else if (m_shader->type == GL_FRAGMENT_SHADER)
1576 m_program->runtimeFragmentShader = m_shader->shader;
1581 class DetachShader : public Operation
1584 DetachShader (SharedPtr<Program> sharder, GLenum type, bool useSync, bool serverSync);
1585 void exec (tcu::ThreadUtil::Thread& thread);
1588 SharedPtr<Program> m_program;
1592 DetachShader::DetachShader (SharedPtr<Program> program, GLenum type, bool useSync, bool serverSync)
1593 : Operation ("DetachShader", useSync, serverSync)
1594 , m_program (program)
1597 modifyGLObject(SharedPtr<Object>(m_program));
1599 if (m_type == GL_VERTEX_SHADER)
1601 DE_ASSERT(m_program->vertexShader);
1602 m_program->vertexShader = SharedPtr<Shader>();
1604 else if (m_type == GL_FRAGMENT_SHADER)
1606 DE_ASSERT(m_program->fragmentShader);
1607 m_program->fragmentShader = SharedPtr<Shader>();
1613 void DetachShader::exec (tcu::ThreadUtil::Thread& t)
1615 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1617 if (m_type == GL_VERTEX_SHADER)
1619 thread.newMessage() << "Begin -- glDetachShader(" << m_program->program << ", " << m_program->runtimeVertexShader << ")" << tcu::ThreadUtil::Message::End;
1620 GLU_CHECK_GLW_CALL(thread.gl, detachShader(m_program->program, m_program->runtimeVertexShader));
1621 thread.newMessage() << "End -- glDetachShader()" << tcu::ThreadUtil::Message::End;
1622 m_program->runtimeVertexShader = 0;
1624 else if (m_type == GL_FRAGMENT_SHADER)
1626 thread.newMessage() << "Begin -- glDetachShader(" << m_program->program << ", " << m_program->runtimeFragmentShader << ")" << tcu::ThreadUtil::Message::End;
1627 GLU_CHECK_GLW_CALL(thread.gl, detachShader(m_program->program, m_program->runtimeFragmentShader));
1628 thread.newMessage() << "End -- glDetachShader()" << tcu::ThreadUtil::Message::End;
1629 m_program->runtimeFragmentShader = 0;
1635 class LinkProgram : public Operation
1638 LinkProgram (SharedPtr<Program> program, bool useSync, bool serverSync);
1639 void exec (tcu::ThreadUtil::Thread& thread);
1642 SharedPtr<Program> m_program;
1645 LinkProgram::LinkProgram (SharedPtr<Program> program, bool useSync, bool serverSync)
1646 : Operation ("LinkProgram", useSync, serverSync)
1647 , m_program (program)
1649 modifyGLObject(SharedPtr<Object>(m_program));
1650 program->linked = true;
1653 void LinkProgram::exec (tcu::ThreadUtil::Thread& t)
1655 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1656 GLuint program = m_program->program;
1658 thread.newMessage() << "Begin -- glLinkProgram(" << program << ")" << tcu::ThreadUtil::Message::End;
1659 GLU_CHECK_GLW_CALL(thread.gl, linkProgram(program));
1660 thread.newMessage() << "End -- glLinkProgram()" << tcu::ThreadUtil::Message::End;
1663 class RenderBuffer : public Operation
1666 RenderBuffer (SharedPtr<Program> program, SharedPtr<Buffer> buffer, bool useSync, bool serverSync);
1667 void exec (tcu::ThreadUtil::Thread& thread);
1670 SharedPtr<Program> m_program;
1671 SharedPtr<Buffer> m_buffer;
1674 RenderBuffer::RenderBuffer (SharedPtr<Program> program, SharedPtr<Buffer> buffer, bool useSync, bool serverSync)
1675 : Operation ("RenderBuffer", useSync, serverSync)
1676 , m_program (program)
1679 readGLObject(SharedPtr<Object>(program));
1680 readGLObject(SharedPtr<Object>(buffer));
1683 void RenderBuffer::exec (tcu::ThreadUtil::Thread& t)
1685 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1687 thread.newMessage() << "Begin -- glClearColor(0.5f, 0.5f, 0.5f, 1.0f)" << tcu::ThreadUtil::Message::End;
1688 GLU_CHECK_GLW_CALL(thread.gl, clearColor(0.5f, 0.5f, 0.5f, 1.0f));
1689 thread.newMessage() << "End -- glClearColor()" << tcu::ThreadUtil::Message::End;
1691 thread.newMessage() << "Begin -- glClear(GL_COLOR_BUFFER_BIT)" << tcu::ThreadUtil::Message::End;
1692 GLU_CHECK_GLW_CALL(thread.gl, clear(GL_COLOR_BUFFER_BIT));
1693 thread.newMessage() << "End -- glClear()" << tcu::ThreadUtil::Message::End;
1695 thread.newMessage() << "Begin -- glUseProgram(" << m_program->program << ")" << tcu::ThreadUtil::Message::End;
1696 GLU_CHECK_GLW_CALL(thread.gl, useProgram(m_program->program));
1697 thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
1699 thread.newMessage() << "Begin -- glGetAttribLocation(" << m_program->program << ", \"a_pos\")" << tcu::ThreadUtil::Message::End;
1700 GLint posLoc = thread.gl.getAttribLocation(m_program->program, "a_pos");
1701 GLU_CHECK_GLW_MSG(thread.gl, "glGetAttribLocation()");
1702 thread.newMessage() << "End -- " << posLoc << " = glGetAttribLocation()" << tcu::ThreadUtil::Message::End;
1704 thread.newMessage() << "Begin -- glEnableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
1705 GLU_CHECK_GLW_CALL(thread.gl, enableVertexAttribArray(posLoc));
1706 thread.newMessage() << "End -- glEnableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
1708 thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, " << m_buffer->buffer << ")" << tcu::ThreadUtil::Message::End;
1709 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, m_buffer->buffer));
1710 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1712 thread.newMessage() << "Begin -- glVertexAttribPointer(" << posLoc << ", GL_BYTE, GL_TRUE, 0, 0)" << tcu::ThreadUtil::Message::End;
1713 GLU_CHECK_GLW_CALL(thread.gl, vertexAttribPointer(posLoc, 2, GL_BYTE, GL_TRUE, 0, 0));
1714 thread.newMessage() << "End -- glVertexAttribPointer()" << tcu::ThreadUtil::Message::End;
1716 thread.newMessage() << "Begin -- glDrawArrays(GL_TRIANGLES, 0, " << (m_buffer->size / 2) << ")" << tcu::ThreadUtil::Message::End;
1717 GLU_CHECK_GLW_CALL(thread.gl, drawArrays(GL_TRIANGLES, 0, (GLsizei)m_buffer->size / 2));
1718 thread.newMessage() << "End -- glDrawArrays()" << tcu::ThreadUtil::Message::End;
1720 thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0)" << tcu::ThreadUtil::Message::End;
1721 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, 0));
1722 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1724 thread.newMessage() << "Begin -- glDisableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
1725 GLU_CHECK_GLW_CALL(thread.gl, disableVertexAttribArray(posLoc));
1726 thread.newMessage() << "End -- glDisableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
1728 thread.newMessage() << "Begin -- glUseProgram(0)" << tcu::ThreadUtil::Message::End;
1729 GLU_CHECK_GLW_CALL(thread.gl, useProgram(0));
1730 thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
1733 class RenderTexture : public Operation
1736 RenderTexture (SharedPtr<Program> program, SharedPtr<Texture> texture, bool useSync, bool serverSync);
1737 void exec (tcu::ThreadUtil::Thread& thread);
1740 SharedPtr<Program> m_program;
1741 SharedPtr<Texture> m_texture;
1744 RenderTexture::RenderTexture (SharedPtr<Program> program, SharedPtr<Texture> texture, bool useSync, bool serverSync)
1745 : Operation ("RenderTexture", useSync, serverSync)
1746 , m_program (program)
1747 , m_texture (texture)
1749 readGLObject(SharedPtr<Object>(program));
1750 readGLObject(SharedPtr<Object>(texture));
1753 void RenderTexture::exec (tcu::ThreadUtil::Thread& t)
1755 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1757 thread.newMessage() << "Begin -- glClearColor(0.5f, 0.5f, 0.5f, 1.0f)" << tcu::ThreadUtil::Message::End;
1758 GLU_CHECK_GLW_CALL(thread.gl, clearColor(0.5f, 0.5f, 0.5f, 1.0f));
1759 thread.newMessage() << "End -- glClearColor()" << tcu::ThreadUtil::Message::End;
1761 thread.newMessage() << "Begin -- glClear(GL_COLOR_BUFFER_BIT)" << tcu::ThreadUtil::Message::End;
1762 GLU_CHECK_GLW_CALL(thread.gl, clear(GL_COLOR_BUFFER_BIT));
1763 thread.newMessage() << "End -- glClear()" << tcu::ThreadUtil::Message::End;
1765 thread.newMessage() << "Begin -- glUseProgram(" << m_program->program << ")" << tcu::ThreadUtil::Message::End;
1766 GLU_CHECK_GLW_CALL(thread.gl, useProgram(m_program->program));
1767 thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
1769 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
1770 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
1771 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1773 thread.newMessage() << "Begin -- glGetUniformLocation(" << m_program->program << ", \"u_sampler\")" << tcu::ThreadUtil::Message::End;
1774 GLint samplerPos = thread.gl.getUniformLocation(m_program->program, "u_sampler");
1775 GLU_CHECK_GLW_MSG(thread.gl, "glGetUniformLocation()");
1776 thread.newMessage() << "End -- glGetUniformLocation()" << tcu::ThreadUtil::Message::End;
1778 thread.newMessage() << "Begin -- glUniform1i(" << samplerPos << ", 0)" << tcu::ThreadUtil::Message::End;
1779 GLU_CHECK_GLW_CALL(thread.gl, uniform1i(samplerPos, 0));
1780 thread.newMessage() << "End -- glUniform1i()" << tcu::ThreadUtil::Message::End;
1783 thread.newMessage() << "Begin -- glGetAttribLocation(" << m_program->program << ", \"a_pos\")" << tcu::ThreadUtil::Message::End;
1784 GLint posLoc = thread.gl.getAttribLocation(m_program->program, "a_pos");
1785 GLU_CHECK_GLW_MSG(thread.gl, "glGetAttribLocation()");
1786 thread.newMessage() << "End -- " << posLoc << " = glGetAttribLocation()" << tcu::ThreadUtil::Message::End;
1788 thread.newMessage() << "Begin -- glEnableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
1789 GLU_CHECK_GLW_CALL(thread.gl, enableVertexAttribArray(posLoc));
1790 thread.newMessage() << "End -- glEnableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
1792 thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0)" << tcu::ThreadUtil::Message::End;
1793 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, 0));
1794 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1807 thread.newMessage() << "Begin -- glVertexAttribPointer(" << posLoc << ", GL_FLOAT, GL_FALSE, 0, <data>)" << tcu::ThreadUtil::Message::End;
1808 GLU_CHECK_GLW_CALL(thread.gl, vertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, coords));
1809 thread.newMessage() << "End -- glVertexAttribPointer()" << tcu::ThreadUtil::Message::End;
1811 thread.newMessage() << "Begin -- glDrawArrays(GL_TRIANGLES, 0, 6)" << tcu::ThreadUtil::Message::End;
1812 GLU_CHECK_GLW_CALL(thread.gl, drawArrays(GL_TRIANGLES, 0, 6));
1813 thread.newMessage() << "End -- glDrawArrays()" << tcu::ThreadUtil::Message::End;
1815 thread.newMessage() << "Begin -- glBindBuffer(GL_ARRAY_BUFFER, 0)" << tcu::ThreadUtil::Message::End;
1816 GLU_CHECK_GLW_CALL(thread.gl, bindBuffer(GL_ARRAY_BUFFER, 0));
1817 thread.newMessage() << "End -- glBindBuffer()" << tcu::ThreadUtil::Message::End;
1819 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
1820 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
1821 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1823 thread.newMessage() << "Begin -- glDisableVertexAttribArray(" << posLoc << ")" << tcu::ThreadUtil::Message::End;
1824 GLU_CHECK_GLW_CALL(thread.gl, disableVertexAttribArray(posLoc));
1825 thread.newMessage() << "End -- glDisableVertexAttribArray()" << tcu::ThreadUtil::Message::End;
1827 thread.newMessage() << "Begin -- glUseProgram(0)" << tcu::ThreadUtil::Message::End;
1828 GLU_CHECK_GLW_CALL(thread.gl, useProgram(0));
1829 thread.newMessage() << "End -- glUseProgram()" << tcu::ThreadUtil::Message::End;
1832 class ReadPixels : public Operation
1835 ReadPixels (int x, int y, int width, int height, GLenum format, GLenum type, SharedPtr<tcu::ThreadUtil::DataBlock>& data, bool useSync, bool serverSync);
1836 void exec (tcu::ThreadUtil::Thread& thread);
1845 SharedPtr<tcu::ThreadUtil::DataBlock> m_data;
1848 ReadPixels::ReadPixels (int x, int y, int width, int height, GLenum format, GLenum type, SharedPtr<tcu::ThreadUtil::DataBlock>& data, bool useSync, bool serverSync)
1849 : Operation ("ReadPixels", useSync, serverSync)
1857 data = SharedPtr<tcu::ThreadUtil::DataBlock>(new tcu::ThreadUtil::DataBlock(getEvent()));
1861 void ReadPixels::exec (tcu::ThreadUtil::Thread& t)
1863 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1865 DE_ASSERT(m_type == GL_UNSIGNED_BYTE);
1866 DE_ASSERT(m_format == GL_RGBA);
1868 std::vector<deUint8> data((m_width-m_x)*(m_height-m_y)*4);
1870 thread.newMessage() << "Begin -- glReadPixels(" << m_x << ", " << m_y << ", " << m_width << ", " << m_height << ", " << m_format << ", " << m_type << ", <data>)" << tcu::ThreadUtil::Message::End;
1871 GLU_CHECK_GLW_CALL(thread.gl, readPixels(m_x, m_y, m_width, m_height, m_format, m_type, &(data[0])));
1872 thread.newMessage() << "End -- glReadPixels()" << tcu::ThreadUtil::Message::End;
1874 m_data->setData(data.size(), &(data[0]));
1877 class CreateImageFromTexture : public Operation
1880 // \note [mika] Unlike eglCreateImageKHR this operation requires current context and uses it for creating EGLImage
1881 // Current context is required to support EGL sync objects in current tests system
1882 CreateImageFromTexture (SharedPtr<EGLImage>& image, SharedPtr<Texture> texture, bool useSync, bool serverSync);
1883 void exec (tcu::ThreadUtil::Thread& thread);
1886 SharedPtr<Texture> m_texture;
1887 SharedPtr<EGLImage> m_image;
1890 CreateImageFromTexture::CreateImageFromTexture (SharedPtr<EGLImage>& image, SharedPtr<Texture> texture, bool useSync, bool serverSync)
1891 : Operation ("CreateImageFromTexture", useSync, serverSync)
1893 modifyGLObject(SharedPtr<Object>(texture));
1894 image = SharedPtr<EGLImage>(new EGLImage(getEvent(), getSync()));
1897 m_texture = texture;
1898 m_texture->sourceImage = m_image;
1901 void CreateImageFromTexture::exec (tcu::ThreadUtil::Thread& t)
1903 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1905 EGLint attribList[] = {
1906 EGL_GL_TEXTURE_LEVEL_KHR, 0,
1910 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
1911 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
1912 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1914 // Make texture image complete...
1915 thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)" << tcu::ThreadUtil::Message::End;
1916 GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
1917 thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
1919 thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)" << tcu::ThreadUtil::Message::End;
1920 GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
1921 thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
1923 thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)" << tcu::ThreadUtil::Message::End;
1924 GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1925 thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
1927 thread.newMessage() << "Begin -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)" << tcu::ThreadUtil::Message::End;
1928 GLU_CHECK_GLW_CALL(thread.gl, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1929 thread.newMessage() << "End -- glTexParameteri()" << tcu::ThreadUtil::Message::End;
1931 thread.newMessage() << "Begin -- eglCreateImageKHR(" << thread.runtimeContext->display << ", " << thread.runtimeContext->context << ", EGL_GL_TEXTURE_2D_KHR, " << m_texture->texture << ", { EGL_GL_TEXTURE_LEVEL_KHR, 0, EGL_NONE })" << tcu::ThreadUtil::Message::End;
1932 m_image->image = thread.egl.createImageKHR(thread.runtimeContext->display, thread.runtimeContext->context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(deUintptr)m_texture->texture, attribList);
1933 EGLU_CHECK_MSG(thread.egl, "eglCreateImageKHR()");
1934 thread.newMessage() << "End -- " << m_image->image << " = eglCreateImageKHR()" << tcu::ThreadUtil::Message::End;
1936 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
1937 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
1938 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
1941 class DestroyImage : public Operation
1944 // \note [mika] Unlike eglDestroyImageKHR this operation requires current context and uses it for creating EGLImage
1945 // Current context is required to support EGL sync objects in current tests system
1946 DestroyImage (SharedPtr<EGLImage> image, bool useSync, bool serverSync);
1947 void exec (tcu::ThreadUtil::Thread& thread);
1950 SharedPtr<EGLImage> m_image;
1953 DestroyImage::DestroyImage (SharedPtr<EGLImage> image, bool useSync, bool serverSync)
1954 : Operation ("CreateImageFromTexture", useSync, serverSync)
1957 modifyGLObject(SharedPtr<Object>(image));
1960 void DestroyImage::exec (tcu::ThreadUtil::Thread& t)
1962 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1964 thread.newMessage() << "Begin -- eglDestroyImageKHR(" << thread.runtimeContext->display << ", " << m_image->image << ")" << tcu::ThreadUtil::Message::End;
1965 thread.egl.destroyImageKHR(thread.runtimeContext->display, m_image->image);
1966 m_image->image = EGL_NO_IMAGE_KHR;
1967 EGLU_CHECK_MSG(thread.egl, "eglDestroyImageKHR()");
1968 thread.newMessage() << "End -- eglDestroyImageKHR()" << tcu::ThreadUtil::Message::End;
1971 class DefineTextureFromImage : public Operation
1974 DefineTextureFromImage (SharedPtr<Texture> texture, SharedPtr<EGLImage> image, bool useSync, bool serverSync);
1975 void exec (tcu::ThreadUtil::Thread& thread);
1978 SharedPtr<Texture> m_texture;
1979 SharedPtr<EGLImage> m_image;
1982 DefineTextureFromImage::DefineTextureFromImage (SharedPtr<Texture> texture, SharedPtr<EGLImage> image, bool useSync, bool serverSync)
1983 : Operation ("DefineTextureFromImage", useSync, serverSync)
1985 readGLObject(SharedPtr<Object>(image));
1986 modifyGLObject(SharedPtr<Object>(texture));
1988 texture->isDefined = true;
1989 texture->sourceImage = image;
1992 m_texture = texture;
1995 void DefineTextureFromImage::exec (tcu::ThreadUtil::Thread& t)
1997 EGLThread& thread = dynamic_cast<EGLThread&>(t);
1999 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, " << m_texture->texture << ")" << tcu::ThreadUtil::Message::End;
2000 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, m_texture->texture));
2001 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
2003 thread.newMessage() << "Begin -- glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, " << m_image->image << ")" << tcu::ThreadUtil::Message::End;
2004 thread.runtimeContext->glExtensions.imageTargetTexture2D(GL_TEXTURE_2D, m_image->image);
2005 GLU_CHECK_GLW_MSG(thread.gl, "glEGLImageTargetTexture2DOES()");
2006 thread.newMessage() << "End -- glEGLImageTargetTexture2DOES()" << tcu::ThreadUtil::Message::End;
2008 thread.newMessage() << "Begin -- glBindTexture(GL_TEXTURE_2D, 0)" << tcu::ThreadUtil::Message::End;
2009 GLU_CHECK_GLW_CALL(thread.gl, bindTexture(GL_TEXTURE_2D, 0));
2010 thread.newMessage() << "End -- glBindTexture()" << tcu::ThreadUtil::Message::End;
2013 } // GLES2ThreadTest
2015 static void requireEGLExtension (const Library& egl, EGLDisplay eglDisplay, const char* requiredExtension)
2017 if (!eglu::hasExtension(egl, eglDisplay, requiredExtension))
2018 TCU_THROW(NotSupportedError, (string(requiredExtension) + " not supported").c_str());
2023 THREADOPERATIONID_NONE = 0,
2025 THREADOPERATIONID_CREATE_BUFFER,
2026 THREADOPERATIONID_DESTROY_BUFFER,
2027 THREADOPERATIONID_BUFFER_DATA,
2028 THREADOPERATIONID_BUFFER_SUBDATA,
2030 THREADOPERATIONID_CREATE_TEXTURE,
2031 THREADOPERATIONID_DESTROY_TEXTURE,
2032 THREADOPERATIONID_TEXIMAGE2D,
2033 THREADOPERATIONID_TEXSUBIMAGE2D,
2034 THREADOPERATIONID_COPYTEXIMAGE2D,
2035 THREADOPERATIONID_COPYTEXSUBIMAGE2D,
2037 THREADOPERATIONID_CREATE_VERTEX_SHADER,
2038 THREADOPERATIONID_CREATE_FRAGMENT_SHADER,
2039 THREADOPERATIONID_DESTROY_SHADER,
2040 THREADOPERATIONID_SHADER_SOURCE,
2041 THREADOPERATIONID_SHADER_COMPILE,
2043 THREADOPERATIONID_ATTACH_SHADER,
2044 THREADOPERATIONID_DETACH_SHADER,
2046 THREADOPERATIONID_CREATE_PROGRAM,
2047 THREADOPERATIONID_DESTROY_PROGRAM,
2048 THREADOPERATIONID_LINK_PROGRAM,
2050 THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE,
2051 THREADOPERATIONID_DESTROY_IMAGE,
2052 THREADOPERATIONID_TEXTURE_FROM_IMAGE,
2054 THREADOPERATIONID_LAST
2057 class GLES2SharingRandomTest : public TestCase
2069 float probabilities[THREADOPERATIONID_LAST][THREADOPERATIONID_LAST];
2071 GLES2SharingRandomTest (EglTestContext& context, const TestConfig& config, const char* name, const char* description);
2072 ~GLES2SharingRandomTest (void);
2076 IterateResult iterate (void);
2078 void addRandomOperation (GLES2ThreadTest::EGLResourceManager& resourceManager);
2081 TestConfig m_config;
2083 de::Random m_random;
2084 tcu::TestLog& m_log;
2085 bool m_threadsStarted;
2086 bool m_threadsRunning;
2087 bool m_executionReady;
2088 bool m_requiresRestart;
2089 deUint64 m_beginTimeUs;
2090 deUint64 m_timeOutUs;
2091 deUint32 m_sleepTimeMs;
2092 deUint64 m_timeOutTimeUs;
2094 std::vector<GLES2ThreadTest::EGLThread*> m_threads;
2096 EGLDisplay m_eglDisplay;
2097 EGLConfig m_eglConfig;
2098 OperationId m_lastOperation;
2100 glw::Functions m_gl;
2103 GLES2SharingRandomTest::TestConfig::TestConfig (void)
2105 , operationCount (0)
2106 , serverSync (false)
2107 , useFenceSync (false)
2110 deMemset(probabilities, 0, sizeof(probabilities));
2113 GLES2SharingRandomTest::GLES2SharingRandomTest (EglTestContext& context, const TestConfig& config, const char* name, const char* description)
2114 : TestCase (context, name, description)
2116 , m_seed (deStringHash(name))
2117 , m_random (deStringHash(name))
2118 , m_log (m_testCtx.getLog())
2119 , m_threadsStarted (false)
2120 , m_threadsRunning (false)
2121 , m_executionReady (false)
2122 , m_requiresRestart (false)
2124 , m_timeOutUs (10000000) // 10 seconds
2125 , m_sleepTimeMs (1) // 1 milliseconds
2126 , m_timeOutTimeUs (0)
2127 , m_eglDisplay (EGL_NO_DISPLAY)
2129 , m_lastOperation (THREADOPERATIONID_NONE)
2133 GLES2SharingRandomTest::~GLES2SharingRandomTest (void)
2135 GLES2SharingRandomTest::deinit();
2138 void GLES2SharingRandomTest::init (void)
2140 const Library& egl = m_eglTestCtx.getLibrary();
2142 const EGLint attribList[] =
2144 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
2145 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
2150 m_eglDisplay = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
2151 m_eglConfig = eglu::chooseSingleConfig(egl, m_eglDisplay, attribList);
2153 m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
2156 if (m_config.useFenceSync)
2157 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_fence_sync");
2159 if (m_config.serverSync)
2160 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_wait_sync");
2162 if (m_config.useImages)
2164 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_image_base");
2165 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_gl_texture_2D_image");
2168 GLES2ThreadTest::EGLResourceManager resourceManager;
2170 for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
2172 m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed+threadNdx)));
2173 SharedPtr<GLES2ThreadTest::GLES2Context> context;
2174 SharedPtr<GLES2ThreadTest::GLES2Context> shared = (threadNdx > 0 ? resourceManager.popContext(0) : SharedPtr<GLES2ThreadTest::GLES2Context>());
2175 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, shared, context));
2177 resourceManager.addContext(context);
2180 resourceManager.addContext(shared);
2184 for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
2186 SharedPtr<GLES2ThreadTest::Surface> surface;
2187 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface));
2188 resourceManager.addSurface(surface);
2191 // Make contexts current
2192 for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
2194 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[threadNdx], m_eglDisplay, resourceManager.popSurface(0), resourceManager.popContext(0)));
2197 // Operations to check fence sync support
2198 if (m_config.useFenceSync)
2200 for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
2202 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
2206 // Init EGLimage support
2207 if (m_config.useImages)
2209 for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
2211 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
2215 // Add random operations
2216 for (int operationNdx = 0; operationNdx < m_config.operationCount; operationNdx++)
2217 addRandomOperation(resourceManager);
2220 for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
2222 SharedPtr<GLES2ThreadTest::GLES2Context> context = m_threads[threadNdx]->context;
2223 SharedPtr<GLES2ThreadTest::Surface> surface = m_threads[threadNdx]->surface;
2225 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[threadNdx], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
2227 resourceManager.addSurface(surface);
2228 resourceManager.addContext(context);
2232 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2233 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroyContext(resourceManager.popContext(0)));
2236 for (int threadNdx = 0; threadNdx < m_config.threadCount; threadNdx++)
2237 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, resourceManager.popSurface(0)));
2240 void GLES2SharingRandomTest::deinit (void)
2242 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2244 delete m_threads[threadNdx];
2245 m_threads[threadNdx] = DE_NULL;
2250 if (m_eglDisplay != EGL_NO_DISPLAY)
2252 m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
2253 m_eglDisplay = EGL_NO_DISPLAY;
2256 TCU_CHECK(!m_requiresRestart);
2259 void GLES2SharingRandomTest::addRandomOperation (GLES2ThreadTest::EGLResourceManager& resourceManager)
2261 int threadNdx = m_random.getUint32() % (deUint32)m_threads.size();
2263 std::vector<OperationId> operations;
2264 std::vector<float> weights;
2266 operations.push_back(THREADOPERATIONID_CREATE_BUFFER);
2267 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_BUFFER]);
2269 operations.push_back(THREADOPERATIONID_CREATE_TEXTURE);
2270 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_TEXTURE]);
2272 operations.push_back(THREADOPERATIONID_CREATE_VERTEX_SHADER);
2273 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_VERTEX_SHADER]);
2275 operations.push_back(THREADOPERATIONID_CREATE_FRAGMENT_SHADER);
2276 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_FRAGMENT_SHADER]);
2278 operations.push_back(THREADOPERATIONID_CREATE_PROGRAM);
2279 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_PROGRAM]);
2281 int destroyableBufferNdx = -1;
2282 int destroyableTextureNdx = -1;
2283 int destroyableShaderNdx = -1;
2284 int destroyableProgramNdx = -1;
2286 int vertexShaderNdx = -1;
2287 int fragmentShaderNdx = -1;
2289 int definedTextureNdx = -1;
2291 int definedBufferNdx = -1;
2293 int definedShaderNdx = -1;
2295 int detachableProgramNdx = -1;
2296 GLenum detachShaderType = GL_VERTEX_SHADER;
2298 int unusedVertexAttachmentProgramNdx = -1;
2299 int unusedFragmentAttachmentProgramNdx = -1;
2301 int linkableProgramNdx = -1;
2303 int attachProgramNdx = -1;
2304 int attachShaderNdx = -1;
2306 int nonSiblingTextureNdx = -1;
2308 if (m_threads[threadNdx]->context->resourceManager->getBufferCount() > 0)
2309 destroyableBufferNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getBufferCount();
2311 if (m_threads[threadNdx]->context->resourceManager->getTextureCount() > 0)
2312 destroyableTextureNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getTextureCount();
2314 if (m_threads[threadNdx]->context->resourceManager->getShaderCount() > 0)
2315 destroyableShaderNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getShaderCount();
2317 if (m_threads[threadNdx]->context->resourceManager->getProgramCount() > 0)
2318 destroyableProgramNdx = m_random.getUint32() % m_threads[threadNdx]->context->resourceManager->getProgramCount();
2320 // Check what kind of buffers we have
2321 for (int bufferNdx = 0; bufferNdx < m_threads[threadNdx]->context->resourceManager->getBufferCount(); bufferNdx++)
2323 SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->getBuffer(bufferNdx);
2325 if (buffer->isDefined)
2327 if (definedBufferNdx == -1)
2328 definedBufferNdx = bufferNdx;
2329 else if (m_random.getBool())
2330 definedBufferNdx = bufferNdx;
2334 // Check what kind of textures we have
2335 for (int textureNdx = 0; textureNdx < m_threads[threadNdx]->context->resourceManager->getTextureCount(); textureNdx++)
2337 SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->getTexture(textureNdx);
2339 if (texture->isDefined)
2341 if (definedTextureNdx == -1)
2342 definedTextureNdx = textureNdx;
2343 else if (m_random.getBool())
2344 definedTextureNdx = textureNdx;
2346 if (!texture->sourceImage)
2348 if (nonSiblingTextureNdx == -1)
2349 nonSiblingTextureNdx = textureNdx;
2350 else if (m_random.getBool())
2351 nonSiblingTextureNdx = textureNdx;
2357 // Check what kind of shaders we have
2358 for (int shaderNdx = 0; shaderNdx < m_threads[threadNdx]->context->resourceManager->getShaderCount(); shaderNdx++)
2360 SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->getShader(shaderNdx);
2362 // Defined shader found
2363 if (shader->isDefined)
2365 if (definedShaderNdx == -1)
2366 definedShaderNdx = shaderNdx;
2367 else if (m_random.getBool())
2368 definedShaderNdx = shaderNdx;
2371 // Vertex shader found
2372 if (shader->type == GL_VERTEX_SHADER)
2374 if (vertexShaderNdx == -1)
2375 vertexShaderNdx = shaderNdx;
2376 else if (m_random.getBool())
2377 vertexShaderNdx = shaderNdx;
2380 // Fragmet shader found
2381 if (shader->type == GL_FRAGMENT_SHADER)
2383 if (fragmentShaderNdx == -1)
2384 fragmentShaderNdx = shaderNdx;
2385 else if (m_random.getBool())
2386 fragmentShaderNdx = shaderNdx;
2390 // Check what kind of programs we have
2391 for (int programNdx = 0; programNdx < m_threads[threadNdx]->context->resourceManager->getProgramCount(); programNdx++)
2393 SharedPtr<GLES2ThreadTest::Program> program = m_threads[threadNdx]->context->resourceManager->getProgram(programNdx);
2395 // Program that can be detached
2396 if (program->vertexShader || program->fragmentShader)
2398 if (detachableProgramNdx == -1)
2400 detachableProgramNdx = programNdx;
2402 if (program->vertexShader)
2403 detachShaderType = GL_VERTEX_SHADER;
2404 else if (program->fragmentShader)
2405 detachShaderType = GL_FRAGMENT_SHADER;
2409 else if (m_random.getBool())
2411 detachableProgramNdx = programNdx;
2413 if (program->vertexShader)
2414 detachShaderType = GL_VERTEX_SHADER;
2415 else if (program->fragmentShader)
2416 detachShaderType = GL_FRAGMENT_SHADER;
2422 // Program that can be attached vertex shader
2423 if (!program->vertexShader)
2425 if (unusedVertexAttachmentProgramNdx == -1)
2426 unusedVertexAttachmentProgramNdx = programNdx;
2427 else if (m_random.getBool())
2428 unusedVertexAttachmentProgramNdx = programNdx;
2431 // Program that can be attached fragment shader
2432 if (!program->fragmentShader)
2434 if (unusedFragmentAttachmentProgramNdx == -1)
2435 unusedFragmentAttachmentProgramNdx = programNdx;
2436 else if (m_random.getBool())
2437 unusedFragmentAttachmentProgramNdx = programNdx;
2440 // Program that can be linked
2441 if (program->vertexShader && program->fragmentShader)
2443 if (linkableProgramNdx == -1)
2444 linkableProgramNdx = programNdx;
2445 else if (m_random.getBool())
2446 linkableProgramNdx = programNdx;
2451 if (resourceManager.getImageCount() > 0)
2453 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_IMAGE]);
2454 operations.push_back(THREADOPERATIONID_DESTROY_IMAGE);
2456 if (m_threads[threadNdx]->context->resourceManager->getTextureCount() > 0)
2458 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXTURE_FROM_IMAGE]);
2459 operations.push_back(THREADOPERATIONID_TEXTURE_FROM_IMAGE);
2464 if (destroyableBufferNdx != -1)
2466 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_BUFFER]);
2467 operations.push_back(THREADOPERATIONID_DESTROY_BUFFER);
2469 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_BUFFER_DATA]);
2470 operations.push_back(THREADOPERATIONID_BUFFER_DATA);
2473 // Has buffer with defined data
2474 if (definedBufferNdx != -1)
2476 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_BUFFER_SUBDATA]);
2477 operations.push_back(THREADOPERATIONID_BUFFER_SUBDATA);
2481 if (destroyableTextureNdx != -1)
2483 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_TEXTURE]);
2484 operations.push_back(THREADOPERATIONID_DESTROY_TEXTURE);
2486 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXIMAGE2D]);
2487 operations.push_back(THREADOPERATIONID_TEXIMAGE2D);
2489 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_COPYTEXIMAGE2D]);
2490 operations.push_back(THREADOPERATIONID_COPYTEXIMAGE2D);
2493 // Has texture with data
2494 if (definedTextureNdx != -1)
2496 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_TEXSUBIMAGE2D]);
2497 operations.push_back(THREADOPERATIONID_TEXSUBIMAGE2D);
2499 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_COPYTEXSUBIMAGE2D]);
2500 operations.push_back(THREADOPERATIONID_COPYTEXSUBIMAGE2D);
2503 // Has texture that can be used as EGLimage source
2504 if (nonSiblingTextureNdx != -1)
2506 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE]);
2507 operations.push_back(THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE);
2511 if (destroyableShaderNdx != -1)
2513 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_SHADER]);
2514 operations.push_back(THREADOPERATIONID_DESTROY_SHADER);
2516 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_SHADER_SOURCE]);
2517 operations.push_back(THREADOPERATIONID_SHADER_SOURCE);
2520 // Has shader with defined source
2521 if (definedShaderNdx != -1)
2523 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_SHADER_COMPILE]);
2524 operations.push_back(THREADOPERATIONID_SHADER_COMPILE);
2528 if (destroyableProgramNdx != -1)
2530 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DESTROY_PROGRAM]);
2531 operations.push_back(THREADOPERATIONID_DESTROY_PROGRAM);
2534 // Has program that can be linked
2535 if (linkableProgramNdx != -1)
2537 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_LINK_PROGRAM]);
2538 operations.push_back(THREADOPERATIONID_LINK_PROGRAM);
2541 // has program with attachments
2542 if (detachableProgramNdx != -1)
2544 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_DETACH_SHADER]);
2545 operations.push_back(THREADOPERATIONID_DETACH_SHADER);
2548 // Has program and shader pair that can be attached
2549 if (fragmentShaderNdx != -1 && unusedFragmentAttachmentProgramNdx != -1)
2551 if (attachProgramNdx == -1)
2553 DE_ASSERT(attachShaderNdx == -1);
2554 attachProgramNdx = unusedFragmentAttachmentProgramNdx;
2555 attachShaderNdx = fragmentShaderNdx;
2557 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_ATTACH_SHADER]);
2558 operations.push_back(THREADOPERATIONID_ATTACH_SHADER);
2560 else if (m_random.getBool())
2562 attachProgramNdx = unusedFragmentAttachmentProgramNdx;
2563 attachShaderNdx = fragmentShaderNdx;
2567 if (vertexShaderNdx != -1 && unusedVertexAttachmentProgramNdx != -1)
2569 if (attachProgramNdx == -1)
2571 DE_ASSERT(attachShaderNdx == -1);
2572 attachProgramNdx = unusedVertexAttachmentProgramNdx;
2573 attachShaderNdx = vertexShaderNdx;
2575 weights.push_back(m_config.probabilities[m_lastOperation][THREADOPERATIONID_ATTACH_SHADER]);
2576 operations.push_back(THREADOPERATIONID_ATTACH_SHADER);
2578 else if (m_random.getBool())
2580 attachProgramNdx = unusedVertexAttachmentProgramNdx;
2581 attachShaderNdx = vertexShaderNdx;
2585 OperationId op = m_random.chooseWeighted<OperationId, std::vector<OperationId> ::iterator>(operations.begin(), operations.end(), weights.begin());
2589 case THREADOPERATIONID_CREATE_BUFFER:
2591 SharedPtr<GLES2ThreadTest::Buffer> buffer;
2592 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
2593 m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
2597 case THREADOPERATIONID_DESTROY_BUFFER:
2599 SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(destroyableBufferNdx);
2600 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
2604 case THREADOPERATIONID_BUFFER_DATA:
2606 SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(destroyableBufferNdx);
2607 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
2608 m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
2612 case THREADOPERATIONID_BUFFER_SUBDATA:
2614 SharedPtr<GLES2ThreadTest::Buffer> buffer = m_threads[threadNdx]->context->resourceManager->popBuffer(definedBufferNdx);
2615 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 1, 20, m_config.useFenceSync, m_config.serverSync));
2616 m_threads[threadNdx]->context->resourceManager->addBuffer(buffer);
2620 case THREADOPERATIONID_CREATE_TEXTURE:
2622 SharedPtr<GLES2ThreadTest::Texture> texture;
2623 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
2624 m_threads[threadNdx]->context->resourceManager->addTexture(texture);
2628 case THREADOPERATIONID_DESTROY_TEXTURE:
2629 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteTexture(m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx), m_config.useFenceSync, m_config.serverSync));
2632 case THREADOPERATIONID_TEXIMAGE2D:
2634 SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
2635 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
2636 m_threads[threadNdx]->context->resourceManager->addTexture(texture);
2640 case THREADOPERATIONID_TEXSUBIMAGE2D:
2642 SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(definedTextureNdx);
2643 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 30, 30, 50, 50, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
2644 m_threads[threadNdx]->context->resourceManager->addTexture(texture);
2648 case THREADOPERATIONID_COPYTEXIMAGE2D:
2650 SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
2651 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 20, 20, 300, 300, 0, m_config.useFenceSync, m_config.serverSync));
2652 m_threads[threadNdx]->context->resourceManager->addTexture(texture);
2656 case THREADOPERATIONID_COPYTEXSUBIMAGE2D:
2658 SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(definedTextureNdx);
2659 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 10, 10, 30, 30, 50, 50, m_config.useFenceSync, m_config.serverSync));
2660 m_threads[threadNdx]->context->resourceManager->addTexture(texture);
2664 case THREADOPERATIONID_CREATE_VERTEX_SHADER:
2666 SharedPtr<GLES2ThreadTest::Shader> shader;
2667 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, shader, m_config.useFenceSync, m_config.serverSync));
2668 m_threads[threadNdx]->context->resourceManager->addShader(shader);
2672 case THREADOPERATIONID_CREATE_FRAGMENT_SHADER:
2674 SharedPtr<GLES2ThreadTest::Shader> shader;
2675 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, shader, m_config.useFenceSync, m_config.serverSync));
2676 m_threads[threadNdx]->context->resourceManager->addShader(shader);
2680 case THREADOPERATIONID_DESTROY_SHADER:
2681 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteShader(m_threads[threadNdx]->context->resourceManager->popShader(destroyableShaderNdx), m_config.useFenceSync, m_config.serverSync));
2684 case THREADOPERATIONID_SHADER_SOURCE:
2686 const char* vertexShaderSource =
2687 "attribute mediump vec4 a_pos;\n"
2688 "varying mediump vec4 v_pos;\n"
2689 "void main (void)\n"
2691 "\tv_pos = a_pos;\n"
2692 "\tgl_Position = a_pos;\n"
2695 const char* fragmentShaderSource =
2696 "varying mediump vec4 v_pos;\n"
2697 "void main (void)\n"
2699 "\tgl_FragColor = v_pos;\n"
2701 SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->popShader(destroyableShaderNdx);
2702 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (shader->type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
2703 m_threads[threadNdx]->context->resourceManager->addShader(shader);
2707 case THREADOPERATIONID_SHADER_COMPILE:
2709 SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->popShader(definedShaderNdx);
2710 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
2711 m_threads[threadNdx]->context->resourceManager->addShader(shader);
2715 case THREADOPERATIONID_CREATE_PROGRAM:
2717 SharedPtr<GLES2ThreadTest::Program> program;
2718 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
2719 m_threads[threadNdx]->context->resourceManager->addProgram(program);
2723 case THREADOPERATIONID_DESTROY_PROGRAM:
2724 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DeleteProgram(m_threads[threadNdx]->context->resourceManager->popProgram(destroyableProgramNdx), m_config.useFenceSync, m_config.serverSync));
2727 case THREADOPERATIONID_ATTACH_SHADER:
2729 SharedPtr<GLES2ThreadTest::Program> program = m_threads[threadNdx]->context->resourceManager->popProgram(attachProgramNdx);
2730 SharedPtr<GLES2ThreadTest::Shader> shader = m_threads[threadNdx]->context->resourceManager->popShader(attachShaderNdx);
2732 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::AttachShader(program, shader, m_config.useFenceSync, m_config.serverSync));
2734 m_threads[threadNdx]->context->resourceManager->addProgram(program);
2735 m_threads[threadNdx]->context->resourceManager->addShader(shader);
2739 case THREADOPERATIONID_DETACH_SHADER:
2741 SharedPtr<GLES2ThreadTest::Program> program = m_threads[threadNdx]->context->resourceManager->popProgram(detachableProgramNdx);
2742 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DetachShader(program, detachShaderType, m_config.useFenceSync, m_config.serverSync));
2743 m_threads[threadNdx]->context->resourceManager->addProgram(program);
2747 case THREADOPERATIONID_LINK_PROGRAM:
2749 SharedPtr<GLES2ThreadTest::Program> program = m_threads[threadNdx]->context->resourceManager->popProgram(linkableProgramNdx);
2750 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
2751 m_threads[threadNdx]->context->resourceManager->addProgram(program);
2755 case THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE:
2757 SharedPtr<GLES2ThreadTest::EGLImage> image;
2758 SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(nonSiblingTextureNdx);
2759 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, texture, m_config.useFenceSync, m_config.serverSync));
2760 // \note [mika] Can source be added back to resourceManager?
2761 m_threads[threadNdx]->context->resourceManager->addTexture(texture);
2762 resourceManager.addImage(image);
2766 case THREADOPERATIONID_DESTROY_IMAGE:
2768 int imageNdx = m_random.getInt(0, resourceManager.getImageCount()-1);
2769 SharedPtr<GLES2ThreadTest::EGLImage> image = resourceManager.popImage(imageNdx);
2770 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
2774 case THREADOPERATIONID_TEXTURE_FROM_IMAGE:
2776 int imageNdx = m_random.getInt(0, resourceManager.getImageCount()-1);
2777 SharedPtr<GLES2ThreadTest::Texture> texture = m_threads[threadNdx]->context->resourceManager->popTexture(destroyableTextureNdx);
2778 SharedPtr<GLES2ThreadTest::EGLImage> image = resourceManager.popImage(imageNdx);
2779 m_threads[threadNdx]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
2780 m_threads[threadNdx]->context->resourceManager->addTexture(texture);
2781 resourceManager.addImage(image);
2789 m_lastOperation = op;
2792 tcu::TestCase::IterateResult GLES2SharingRandomTest::iterate (void)
2794 if (!m_threadsStarted)
2796 m_beginTimeUs = deGetMicroseconds();
2799 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2800 m_threads[threadNdx]->exec();
2802 m_threadsStarted = true;
2803 m_threadsRunning = true;
2806 if (m_threadsRunning)
2808 // Wait threads to finish
2809 int readyThreads = 0;
2810 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2812 const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
2814 if (status != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING && status != tcu::ThreadUtil::Thread::THREADSTATUS_NOT_STARTED)
2818 if (readyThreads == (int)m_threads.size())
2820 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2821 m_threads[threadNdx]->join();
2823 m_executionReady = true;
2824 m_requiresRestart = false;
2827 if (deGetMicroseconds() - m_beginTimeUs > m_timeOutUs)
2829 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2831 if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
2833 if (m_threads[threadNdx]->isStarted())
2834 m_threads[threadNdx]->join();
2837 m_executionReady = true;
2838 m_requiresRestart = true;
2839 m_timeOutTimeUs = deGetMicroseconds();
2843 deSleep(m_sleepTimeMs);
2847 if (m_executionReady)
2849 std::vector<int> indices(m_threads.size(), 0);
2851 if (m_timeOutTimeUs != 0)
2852 m_log << tcu::TestLog::Message << "Execution timeout limit reached. Trying to get per thread logs. This is potentially dangerous." << tcu::TestLog::EndMessage;
2856 int firstThread = -1;
2858 // Find first thread with messages
2859 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2861 if (m_threads[threadNdx]->getMessageCount() > indices[threadNdx])
2863 firstThread = threadNdx;
2869 if (firstThread == -1)
2872 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2874 // No more messages in this thread
2875 if (m_threads[threadNdx]->getMessageCount() <= indices[threadNdx])
2878 if ((m_threads[threadNdx]->getMessage(indices[threadNdx]).getTime() - m_beginTimeUs) < (m_threads[firstThread]->getMessage(indices[firstThread]).getTime() - m_beginTimeUs))
2879 firstThread = threadNdx;
2882 tcu::ThreadUtil::Message message = m_threads[firstThread]->getMessage(indices[firstThread]);
2884 m_log << tcu::TestLog::Message << "[" << (message.getTime() - m_beginTimeUs) << "] (" << firstThread << ") " << message.getMessage() << tcu::TestLog::EndMessage;
2885 indices[firstThread]++;
2888 if (m_timeOutTimeUs != 0)
2889 m_log << tcu::TestLog::Message << "[" << (m_timeOutTimeUs - m_beginTimeUs) << "] Execution timeout limit reached" << tcu::TestLog::EndMessage;
2892 bool notSupported = false;
2894 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
2896 const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
2900 case tcu::ThreadUtil::Thread::THREADSTATUS_FAILED:
2901 case tcu::ThreadUtil::Thread::THREADSTATUS_INIT_FAILED:
2902 case tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING:
2906 case tcu::ThreadUtil::Thread::THREADSTATUS_NOT_SUPPORTED:
2907 notSupported = true;
2910 case tcu::ThreadUtil::Thread::THREADSTATUS_READY:
2921 throw tcu::NotSupportedError("Thread threw tcu::NotSupportedError", "", __FILE__, __LINE__);
2924 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
2926 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
2934 class GLES2ThreadedSharingTest : public TestCase
2941 RESOURCETYPE_BUFFER = 0,
2942 RESOURCETYPE_TEXTURE,
2943 RESOURCETYPE_VERTEX_SHADER,
2944 RESOURCETYPE_FRAGMENT_SHADER,
2945 RESOURCETYPE_PROGRAM,
2949 ResourceType resourceType;
2957 GLES2ThreadedSharingTest (EglTestContext& context, const TestConfig& config, const char* name, const char* description);
2958 ~GLES2ThreadedSharingTest (void);
2962 IterateResult iterate (void);
2964 void addBufferOperations (void);
2965 void addTextureOperations (void);
2966 void addImageOperations (void);
2967 void addShaderOperations (GLenum type);
2968 void addProgramOperations (void);
2971 TestConfig m_config;
2972 tcu::TestLog& m_log;
2974 bool m_threadsStarted;
2975 bool m_threadsRunning;
2976 bool m_executionReady;
2977 bool m_requiresRestart;
2978 deUint64 m_beginTimeUs;
2979 deUint64 m_timeOutUs;
2980 deUint32 m_sleepTimeMs;
2981 deUint64 m_timeOutTimeUs;
2983 std::vector<GLES2ThreadTest::EGLThread*> m_threads;
2985 EGLDisplay m_eglDisplay;
2986 EGLConfig m_eglConfig;
2987 glw::Functions m_gl;
2990 GLES2ThreadedSharingTest::GLES2ThreadedSharingTest (EglTestContext& context, const TestConfig& config, const char* name, const char* description)
2991 : TestCase (context, name, description)
2993 , m_log (m_testCtx.getLog())
2994 , m_seed (deStringHash(name))
2995 , m_threadsStarted (false)
2996 , m_threadsRunning (false)
2997 , m_executionReady (false)
2998 , m_requiresRestart (false)
3000 , m_timeOutUs (10000000) // 10 seconds
3001 , m_sleepTimeMs (1) // 1 milliseconds
3002 , m_timeOutTimeUs (0)
3003 , m_eglDisplay (EGL_NO_DISPLAY)
3008 GLES2ThreadedSharingTest::~GLES2ThreadedSharingTest (void)
3010 GLES2ThreadedSharingTest::deinit();
3013 void GLES2ThreadedSharingTest::init (void)
3015 const Library& egl = m_eglTestCtx.getLibrary();
3017 const EGLint attribList[] =
3019 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
3020 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
3025 m_eglDisplay = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
3026 m_eglConfig = eglu::chooseSingleConfig(egl, m_eglDisplay, attribList);
3028 m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
3031 if (m_config.useFenceSync)
3032 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_fence_sync");
3034 if (m_config.serverSync)
3035 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_wait_sync");
3037 if (m_config.resourceType == TestConfig::RESOURCETYPE_IMAGE)
3039 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_image_base");
3040 requireEGLExtension(egl, m_eglDisplay, "EGL_KHR_gl_texture_2D_image");
3044 m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed)));
3045 m_threads.push_back(new GLES2ThreadTest::EGLThread(egl, m_gl, deInt32Hash(m_seed*200)));
3047 SharedPtr<GLES2ThreadTest::GLES2Context> contex1;
3048 SharedPtr<GLES2ThreadTest::GLES2Context> contex2;
3050 SharedPtr<GLES2ThreadTest::Surface> surface1;
3051 SharedPtr<GLES2ThreadTest::Surface> surface2;
3054 m_threads[0]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, SharedPtr<GLES2ThreadTest::GLES2Context>(), contex1));
3055 m_threads[1]->addOperation(new GLES2ThreadTest::CreateContext(m_eglDisplay, m_eglConfig, contex1, contex2));
3058 m_threads[0]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface1));
3059 m_threads[1]->addOperation(new GLES2ThreadTest::CreatePBufferSurface(m_eglDisplay, m_eglConfig, 400, 400, surface2));
3061 // Make current contexts
3062 m_threads[0]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, surface1, contex1));
3063 m_threads[1]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[1], m_eglDisplay, surface2, contex2));
3064 // Operations to check fence sync support
3065 if (m_config.useFenceSync)
3067 m_threads[0]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
3068 m_threads[1]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_sync"));
3072 switch (m_config.resourceType)
3074 case TestConfig::RESOURCETYPE_BUFFER:
3075 addBufferOperations();
3078 case TestConfig::RESOURCETYPE_TEXTURE:
3079 addTextureOperations();
3082 case TestConfig::RESOURCETYPE_IMAGE:
3083 addImageOperations();
3086 case TestConfig::RESOURCETYPE_VERTEX_SHADER:
3087 addShaderOperations(GL_VERTEX_SHADER);
3090 case TestConfig::RESOURCETYPE_FRAGMENT_SHADER:
3091 addShaderOperations(GL_FRAGMENT_SHADER);
3094 case TestConfig::RESOURCETYPE_PROGRAM:
3095 addProgramOperations();
3103 m_threads[0]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
3104 m_threads[1]->addOperation(new GLES2ThreadTest::MakeCurrent(*m_threads[0], m_eglDisplay, SharedPtr<GLES2ThreadTest::Surface>(), SharedPtr<GLES2ThreadTest::GLES2Context>()));
3107 m_threads[0]->addOperation(new GLES2ThreadTest::DestroyContext(contex1));
3108 m_threads[1]->addOperation(new GLES2ThreadTest::DestroyContext(contex2));
3111 m_threads[0]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, surface1));
3112 m_threads[1]->addOperation(new GLES2ThreadTest::DestroySurface(m_eglDisplay, surface2));
3115 void GLES2ThreadedSharingTest::addBufferOperations (void)
3117 // Add operations for verify
3118 SharedPtr<GLES2ThreadTest::Shader> vertexShader;
3119 SharedPtr<GLES2ThreadTest::Shader> fragmentShader;
3120 SharedPtr<GLES2ThreadTest::Program> program;
3122 if (m_config.render)
3124 const char* vertexShaderSource =
3125 "attribute highp vec2 a_pos;\n"
3126 "varying mediump vec2 v_pos;\n"
3129 "\tv_pos = a_pos;\n"
3130 "\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
3133 const char* fragmentShaderSource =
3134 "varying mediump vec2 v_pos;\n"
3137 "\tgl_FragColor = vec4(v_pos, 0.5, 1.0);\n"
3140 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
3141 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
3142 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
3144 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3145 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
3146 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3148 m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
3149 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3150 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
3152 m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
3155 SharedPtr<GLES2ThreadTest::Buffer> buffer;
3157 m_threads[0]->addOperation(new GLES2ThreadTest::CreateBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
3159 if (m_config.define)
3161 if (m_config.modify || m_config.render)
3162 m_threads[0]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
3164 m_threads[1]->addOperation(new GLES2ThreadTest::BufferData(buffer, GL_ARRAY_BUFFER, 1024, GL_DYNAMIC_DRAW, m_config.useFenceSync, m_config.serverSync));
3167 if (m_config.modify)
3169 if (m_config.render)
3170 m_threads[0]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 17, 17, m_config.useFenceSync, m_config.serverSync));
3172 m_threads[1]->addOperation(new GLES2ThreadTest::BufferSubData(buffer, GL_ARRAY_BUFFER, 17, 17, m_config.useFenceSync, m_config.serverSync));
3175 if (m_config.render)
3177 m_threads[0]->addOperation(new GLES2ThreadTest::RenderBuffer(program, buffer, m_config.useFenceSync, m_config.serverSync));
3178 m_threads[1]->addOperation(new GLES2ThreadTest::RenderBuffer(program, buffer, m_config.useFenceSync, m_config.serverSync));
3180 SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
3181 SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
3183 m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
3184 m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
3186 m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
3189 if (m_config.modify || m_config.render)
3190 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
3192 m_threads[1]->addOperation(new GLES2ThreadTest::DeleteBuffer(buffer, m_config.useFenceSync, m_config.serverSync));
3194 if (m_config.render)
3196 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
3197 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3198 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
3202 void GLES2ThreadedSharingTest::addTextureOperations (void)
3204 // Add operations for verify
3205 SharedPtr<GLES2ThreadTest::Shader> vertexShader;
3206 SharedPtr<GLES2ThreadTest::Shader> fragmentShader;
3207 SharedPtr<GLES2ThreadTest::Program> program;
3209 if (m_config.render)
3211 const char* vertexShaderSource =
3212 "attribute highp vec2 a_pos;\n"
3213 "varying mediump vec2 v_pos;\n"
3216 "\tv_pos = a_pos;\n"
3217 "\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
3220 const char* fragmentShaderSource =
3221 "varying mediump vec2 v_pos;\n"
3222 "uniform sampler2D u_sampler;\n"
3225 "\tgl_FragColor = texture2D(u_sampler, v_pos);\n"
3228 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
3229 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
3230 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
3232 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3233 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
3234 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3236 m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
3237 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3238 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
3240 m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
3243 SharedPtr<GLES2ThreadTest::Texture> texture;
3245 m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
3247 if (m_config.define == 1)
3249 if (m_config.modify || m_config.render)
3250 m_threads[0]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3252 m_threads[1]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3255 if (m_config.define == 2)
3257 if (m_config.modify || m_config.render)
3258 m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 17, 17, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
3260 m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 17, 17, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
3263 if (m_config.modify == 1)
3265 if (m_config.render)
3266 m_threads[0]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3268 m_threads[1]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3271 if (m_config.modify == 2)
3273 if (m_config.render)
3274 m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
3276 m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
3279 if (m_config.render)
3281 SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
3282 SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
3284 m_threads[0]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
3285 m_threads[1]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
3287 m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
3288 m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
3290 m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
3293 if (m_config.modify || m_config.render)
3294 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
3296 m_threads[1]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
3298 if (m_config.render)
3300 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
3301 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3302 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
3306 void GLES2ThreadedSharingTest::addImageOperations (void)
3308 // Add operations for verify
3309 SharedPtr<GLES2ThreadTest::Shader> vertexShader;
3310 SharedPtr<GLES2ThreadTest::Shader> fragmentShader;
3311 SharedPtr<GLES2ThreadTest::Program> program;
3313 m_threads[0]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
3314 m_threads[1]->addOperation(new GLES2ThreadTest::InitGLExtension("GL_OES_EGL_image"));
3316 if (m_config.render)
3318 const char* vertexShaderSource =
3319 "attribute highp vec2 a_pos;\n"
3320 "varying mediump vec2 v_pos;\n"
3323 "\tv_pos = a_pos;\n"
3324 "\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
3327 const char* fragmentShaderSource =
3328 "varying mediump vec2 v_pos;\n"
3329 "uniform sampler2D u_sampler;\n"
3332 "\tgl_FragColor = texture2D(u_sampler, v_pos);\n"
3335 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
3336 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
3337 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
3339 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3340 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
3341 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3343 m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
3344 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3345 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
3347 m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
3350 SharedPtr<GLES2ThreadTest::Texture> sourceTexture;
3351 SharedPtr<GLES2ThreadTest::Texture> texture;
3352 SharedPtr<GLES2ThreadTest::EGLImage> image;
3354 m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(sourceTexture, m_config.useFenceSync, m_config.serverSync));
3355 m_threads[0]->addOperation(new GLES2ThreadTest::TexImage2D(sourceTexture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3357 if (m_config.define == 1)
3359 if (m_config.modify || m_config.render)
3360 m_threads[0]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
3362 m_threads[1]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
3365 if (m_config.define == 2)
3367 m_threads[0]->addOperation(new GLES2ThreadTest::CreateImageFromTexture(image, sourceTexture, m_config.useFenceSync, m_config.serverSync));
3368 m_threads[0]->addOperation(new GLES2ThreadTest::CreateTexture(texture, m_config.useFenceSync, m_config.serverSync));
3370 if (m_config.modify || m_config.render)
3371 m_threads[0]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
3373 m_threads[1]->addOperation(new GLES2ThreadTest::DefineTextureFromImage(texture, image, m_config.useFenceSync, m_config.serverSync));
3376 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(sourceTexture, m_config.useFenceSync, m_config.serverSync));
3378 if (m_config.modify == 1)
3380 DE_ASSERT(m_config.define != 1);
3382 if (m_config.render)
3383 m_threads[0]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3385 m_threads[1]->addOperation(new GLES2ThreadTest::TexSubImage2D(texture, 0, 17, 17, 29, 29, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3388 if (m_config.modify == 2)
3390 DE_ASSERT(m_config.define != 1);
3392 if (m_config.render)
3393 m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
3395 m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexSubImage2D(texture, 0, 7, 7, 17, 17, 29, 29, m_config.useFenceSync, m_config.serverSync));
3398 if (m_config.modify == 3)
3400 DE_ASSERT(m_config.define != 1);
3402 if (m_config.render)
3403 m_threads[0]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3405 m_threads[1]->addOperation(new GLES2ThreadTest::TexImage2D(texture, 0, GL_RGBA, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, m_config.useFenceSync, m_config.serverSync));
3408 if (m_config.modify == 4)
3410 DE_ASSERT(m_config.define != 1);
3412 if (m_config.render)
3413 m_threads[0]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 7, 7, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
3415 m_threads[1]->addOperation(new GLES2ThreadTest::CopyTexImage2D(texture, 0, GL_RGBA, 7, 7, 256, 256, 0, m_config.useFenceSync, m_config.serverSync));
3418 if (m_config.render)
3420 DE_ASSERT(m_config.define != 1);
3422 SharedPtr<tcu::ThreadUtil::DataBlock> pixels1;
3423 SharedPtr<tcu::ThreadUtil::DataBlock> pixels2;
3425 m_threads[0]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
3426 m_threads[1]->addOperation(new GLES2ThreadTest::RenderTexture(program, texture, m_config.useFenceSync, m_config.serverSync));
3428 m_threads[0]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels1, m_config.useFenceSync, m_config.serverSync));
3429 m_threads[1]->addOperation(new GLES2ThreadTest::ReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, pixels2, m_config.useFenceSync, m_config.serverSync));
3431 m_threads[0]->addOperation(new tcu::ThreadUtil::CompareData(pixels1, pixels2));
3436 if (m_config.modify || m_config.render)
3437 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
3439 m_threads[1]->addOperation(new GLES2ThreadTest::DeleteTexture(texture, m_config.useFenceSync, m_config.serverSync));
3442 if (m_config.modify || m_config.render)
3443 m_threads[0]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
3445 m_threads[1]->addOperation(new GLES2ThreadTest::DestroyImage(image, m_config.useFenceSync, m_config.serverSync));
3447 if (m_config.render)
3449 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
3450 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3451 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
3455 void GLES2ThreadedSharingTest::addShaderOperations (GLenum type)
3457 SharedPtr<GLES2ThreadTest::Shader> shader;
3459 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(type, shader, m_config.useFenceSync, m_config.serverSync));
3461 if (m_config.define)
3463 const char* vertexShaderSource =
3464 "attribute mediump vec4 a_pos;\n"
3467 "\tgl_Position = a_pos;\n"
3470 const char* fragmentShaderSource =
3473 "\tgl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
3476 if (m_config.modify || m_config.render)
3477 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
3479 m_threads[1]->addOperation(new GLES2ThreadTest::ShaderSource(shader, (type == GL_VERTEX_SHADER ? vertexShaderSource : fragmentShaderSource), m_config.useFenceSync, m_config.serverSync));
3482 if (m_config.modify)
3484 if (m_config.render)
3485 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
3487 m_threads[1]->addOperation(new GLES2ThreadTest::ShaderCompile(shader, m_config.useFenceSync, m_config.serverSync));
3490 DE_ASSERT(!m_config.render);
3492 if (m_config.modify || m_config.render)
3493 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(shader, m_config.useFenceSync, m_config.serverSync));
3495 m_threads[1]->addOperation(new GLES2ThreadTest::DeleteShader(shader, m_config.useFenceSync, m_config.serverSync));
3498 void GLES2ThreadedSharingTest::addProgramOperations (void)
3500 // Add operations for verify
3501 SharedPtr<GLES2ThreadTest::Shader> vertexShader;
3502 SharedPtr<GLES2ThreadTest::Shader> fragmentShader;
3504 if (m_config.define)
3506 const char* vertexShaderSource =
3507 "attribute highp vec2 a_pos;\n"
3508 "varying mediump vec2 v_pos;\n"
3511 "\tv_pos = a_pos;\n"
3512 "\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
3515 const char* fragmentShaderSource =
3516 "varying mediump vec2 v_pos;\n"
3519 "\tgl_FragColor = vec4(v_pos, 0.5, 1.0);\n"
3522 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_VERTEX_SHADER, vertexShader, m_config.useFenceSync, m_config.serverSync));
3523 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(vertexShader, vertexShaderSource, m_config.useFenceSync, m_config.serverSync));
3524 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(vertexShader, m_config.useFenceSync, m_config.serverSync));
3526 m_threads[0]->addOperation(new GLES2ThreadTest::CreateShader(GL_FRAGMENT_SHADER, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3527 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderSource(fragmentShader, fragmentShaderSource, m_config.useFenceSync, m_config.serverSync));
3528 m_threads[0]->addOperation(new GLES2ThreadTest::ShaderCompile(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3531 SharedPtr<GLES2ThreadTest::Program> program;
3533 m_threads[0]->addOperation(new GLES2ThreadTest::CreateProgram(program, m_config.useFenceSync, m_config.serverSync));
3535 if (m_config.define)
3538 if (m_config.modify || m_config.render)
3540 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
3541 m_threads[0]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3545 m_threads[1]->addOperation(new GLES2ThreadTest::AttachShader(program, vertexShader, m_config.useFenceSync, m_config.serverSync));
3546 m_threads[1]->addOperation(new GLES2ThreadTest::AttachShader(program, fragmentShader, m_config.useFenceSync, m_config.serverSync));
3550 if (m_config.modify == 1)
3553 if (m_config.render)
3554 m_threads[0]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
3556 m_threads[1]->addOperation(new GLES2ThreadTest::LinkProgram(program, m_config.useFenceSync, m_config.serverSync));
3559 if (m_config.modify == 2)
3562 if (m_config.render)
3564 m_threads[0]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_VERTEX_SHADER, m_config.useFenceSync, m_config.serverSync));
3565 m_threads[0]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_FRAGMENT_SHADER, m_config.useFenceSync, m_config.serverSync));
3569 m_threads[1]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_VERTEX_SHADER, m_config.useFenceSync, m_config.serverSync));
3570 m_threads[1]->addOperation(new GLES2ThreadTest::DetachShader(program, GL_FRAGMENT_SHADER, m_config.useFenceSync, m_config.serverSync));
3574 if (m_config.render)
3579 if (m_config.modify || m_config.render)
3580 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
3582 m_threads[1]->addOperation(new GLES2ThreadTest::DeleteProgram(program, m_config.useFenceSync, m_config.serverSync));
3584 if (m_config.render)
3586 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(vertexShader, m_config.useFenceSync, m_config.serverSync));
3587 m_threads[0]->addOperation(new GLES2ThreadTest::DeleteShader(fragmentShader, m_config.useFenceSync, m_config.serverSync));
3591 void GLES2ThreadedSharingTest::deinit (void)
3593 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3595 delete m_threads[threadNdx];
3596 m_threads[threadNdx] = DE_NULL;
3601 if (m_eglDisplay != EGL_NO_DISPLAY)
3603 m_eglTestCtx.getLibrary().terminate(m_eglDisplay);
3604 m_eglDisplay = EGL_NO_DISPLAY;
3607 TCU_CHECK(!m_requiresRestart);
3610 tcu::TestCase::IterateResult GLES2ThreadedSharingTest::iterate (void)
3612 if (!m_threadsStarted)
3614 m_beginTimeUs = deGetMicroseconds();
3617 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3618 m_threads[threadNdx]->exec();
3620 m_threadsStarted = true;
3621 m_threadsRunning = true;
3624 if (m_threadsRunning)
3626 // Wait threads to finish
3627 int readyThreads = 0;
3628 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3630 if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
3634 if (readyThreads == (int)m_threads.size())
3636 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3637 m_threads[threadNdx]->join();
3639 m_executionReady = true;
3640 m_requiresRestart = false;
3643 if (deGetMicroseconds() - m_beginTimeUs > m_timeOutUs)
3645 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3647 if (m_threads[threadNdx]->getStatus() != tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING)
3648 m_threads[threadNdx]->join();
3650 m_executionReady = true;
3651 m_requiresRestart = true;
3652 m_timeOutTimeUs = deGetMicroseconds();
3656 deSleep(m_sleepTimeMs);
3660 if (m_executionReady)
3662 std::vector<int> indices(m_threads.size(), 0);
3664 if (m_timeOutTimeUs != 0)
3665 m_log << tcu::TestLog::Message << "Execution timeout limit reached. Trying to get per thread logs. This is potentially dangerous." << tcu::TestLog::EndMessage;
3669 int firstThread = -1;
3671 // Find first thread with messages
3672 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3674 if (m_threads[threadNdx]->getMessageCount() > indices[threadNdx])
3676 firstThread = threadNdx;
3682 if (firstThread == -1)
3685 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3687 // No more messages in this thread
3688 if (m_threads[threadNdx]->getMessageCount() <= indices[threadNdx])
3691 if ((m_threads[threadNdx]->getMessage(indices[threadNdx]).getTime() - m_beginTimeUs) < (m_threads[firstThread]->getMessage(indices[firstThread]).getTime() - m_beginTimeUs))
3692 firstThread = threadNdx;
3695 tcu::ThreadUtil::Message message = m_threads[firstThread]->getMessage(indices[firstThread]);
3697 m_log << tcu::TestLog::Message << "[" << (message.getTime() - m_beginTimeUs) << "] (" << firstThread << ") " << message.getMessage() << tcu::TestLog::EndMessage;
3698 indices[firstThread]++;
3701 if (m_timeOutTimeUs != 0)
3702 m_log << tcu::TestLog::Message << "[" << (m_timeOutTimeUs - m_beginTimeUs) << "] Execution timeout limit reached" << tcu::TestLog::EndMessage;
3705 bool notSupported = false;
3707 for (int threadNdx = 0; threadNdx < (int)m_threads.size(); threadNdx++)
3709 const tcu::ThreadUtil::Thread::ThreadStatus status = m_threads[threadNdx]->getStatus();
3713 case tcu::ThreadUtil::Thread::THREADSTATUS_FAILED:
3714 case tcu::ThreadUtil::Thread::THREADSTATUS_INIT_FAILED:
3715 case tcu::ThreadUtil::Thread::THREADSTATUS_RUNNING:
3719 case tcu::ThreadUtil::Thread::THREADSTATUS_NOT_SUPPORTED:
3720 notSupported = true;
3723 case tcu::ThreadUtil::Thread::THREADSTATUS_READY:
3734 throw tcu::NotSupportedError("Thread threw tcu::NotSupportedError", "", __FILE__, __LINE__);
3737 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
3739 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
3747 static void addSimpleTests (EglTestContext& ctx, tcu::TestCaseGroup* group, bool useSync, bool serverSync)
3750 TestCaseGroup* bufferTests = new TestCaseGroup(ctx, "buffers", "Buffer management tests");
3753 GLES2ThreadedSharingTest::TestConfig config;
3755 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
3756 config.useFenceSync = useSync;
3757 config.serverSync = serverSync;
3760 config.render = false;
3761 bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "gen_delete", "Generate and delete buffer"));
3765 GLES2ThreadedSharingTest::TestConfig config;
3767 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
3768 config.useFenceSync = useSync;
3769 config.serverSync = serverSync;
3772 config.render = false;
3773 bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "bufferdata", "Generate, set data and delete buffer"));
3777 GLES2ThreadedSharingTest::TestConfig config;
3779 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
3780 config.useFenceSync = useSync;
3781 config.serverSync = serverSync;
3784 config.render = false;
3785 bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "buffersubdata", "Generate, set data, update data and delete buffer"));
3789 GLES2ThreadedSharingTest::TestConfig config;
3791 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
3792 config.useFenceSync = useSync;
3793 config.serverSync = serverSync;
3796 config.render = true;
3797 bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "bufferdata_render", "Generate, set data, render and delete buffer"));
3801 GLES2ThreadedSharingTest::TestConfig config;
3803 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_BUFFER;
3804 config.useFenceSync = useSync;
3805 config.serverSync = serverSync;
3808 config.render = true;
3809 bufferTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "buffersubdata_render", "Generate, set data, update data, render and delete buffer"));
3812 group->addChild(bufferTests);
3816 TestCaseGroup* textureTests = new TestCaseGroup(ctx, "textures", "Texture management tests");
3819 GLES2ThreadedSharingTest::TestConfig config;
3821 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3822 config.useFenceSync = useSync;
3823 config.serverSync = serverSync;
3826 config.render = false;
3827 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "gen_delete", "Generate and delete texture"));
3831 GLES2ThreadedSharingTest::TestConfig config;
3833 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3834 config.useFenceSync = useSync;
3835 config.serverSync = serverSync;
3838 config.render = false;
3839 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d", "Generate, set data and delete texture"));
3843 GLES2ThreadedSharingTest::TestConfig config;
3845 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3846 config.useFenceSync = useSync;
3847 config.serverSync = serverSync;
3850 config.render = false;
3851 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_texsubimage2d", "Generate, set data, update data and delete texture"));
3855 GLES2ThreadedSharingTest::TestConfig config;
3857 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3858 config.useFenceSync = useSync;
3859 config.serverSync = serverSync;
3862 config.render = false;
3863 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_copytexsubimage2d", "Generate, set data, update data and delete texture"));
3867 GLES2ThreadedSharingTest::TestConfig config;
3869 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3870 config.useFenceSync = useSync;
3871 config.serverSync = serverSync;
3874 config.render = true;
3875 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_render", "Generate, set data, render and delete texture"));
3879 GLES2ThreadedSharingTest::TestConfig config;
3881 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3882 config.useFenceSync = useSync;
3883 config.serverSync = serverSync;
3886 config.render = true;
3887 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_texsubimage2d_render", "Generate, set data, update data, render and delete texture"));
3891 GLES2ThreadedSharingTest::TestConfig config;
3893 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3894 config.useFenceSync = useSync;
3895 config.serverSync = serverSync;
3898 config.render = true;
3899 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_copytexsubimage2d_render", "Generate, set data, update data, render and delete texture"));
3903 GLES2ThreadedSharingTest::TestConfig config;
3905 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3906 config.useFenceSync = useSync;
3907 config.serverSync = serverSync;
3910 config.render = false;
3911 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d", "Generate, set data and delete texture"));
3915 GLES2ThreadedSharingTest::TestConfig config;
3917 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3918 config.useFenceSync = useSync;
3919 config.serverSync = serverSync;
3922 config.render = false;
3923 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_texsubimage2d", "Generate, set data, update data and delete texture"));
3927 GLES2ThreadedSharingTest::TestConfig config;
3929 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3930 config.useFenceSync = useSync;
3931 config.serverSync = serverSync;
3934 config.render = false;
3935 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_copytexsubimage2d", "Generate, set data, update data and delete texture"));
3939 GLES2ThreadedSharingTest::TestConfig config;
3941 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3942 config.useFenceSync = useSync;
3943 config.serverSync = serverSync;
3946 config.render = true;
3947 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_render", "Generate, set data, render and delete texture"));
3951 GLES2ThreadedSharingTest::TestConfig config;
3953 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3954 config.useFenceSync = useSync;
3955 config.serverSync = serverSync;
3958 config.render = true;
3959 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_texsubimage2d_render", "Generate, set data, update data, render and delete texture"));
3963 GLES2ThreadedSharingTest::TestConfig config;
3965 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_TEXTURE;
3966 config.useFenceSync = useSync;
3967 config.serverSync = serverSync;
3970 config.render = true;
3971 textureTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_copytexsubimage2d_render", "Generate, set data, update data, render and delete texture"));
3974 group->addChild(textureTests);
3978 TestCaseGroup* shaderTests = new TestCaseGroup(ctx, "shaders", "Shader management tests");
3981 GLES2ThreadedSharingTest::TestConfig config;
3983 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
3984 config.useFenceSync = useSync;
3985 config.serverSync = serverSync;
3988 config.render = false;
3989 shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_create_destroy", "Create and delete shader"));
3993 GLES2ThreadedSharingTest::TestConfig config;
3995 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
3996 config.useFenceSync = useSync;
3997 config.serverSync = serverSync;
4000 config.render = false;
4001 shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_shadersource", "Create, set source and delete shader"));
4005 GLES2ThreadedSharingTest::TestConfig config;
4007 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_VERTEX_SHADER;
4008 config.useFenceSync = useSync;
4009 config.serverSync = serverSync;
4012 config.render = false;
4013 shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "vtx_compile", "Create, set source, compile and delete shader"));
4017 GLES2ThreadedSharingTest::TestConfig config;
4019 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
4020 config.useFenceSync = useSync;
4021 config.serverSync = serverSync;
4024 config.render = false;
4025 shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_create_destroy", "Create and delete shader"));
4029 GLES2ThreadedSharingTest::TestConfig config;
4031 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
4032 config.useFenceSync = useSync;
4033 config.serverSync = serverSync;
4036 config.render = false;
4037 shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_shadersource", "Create, set source and delete shader"));
4041 GLES2ThreadedSharingTest::TestConfig config;
4043 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_FRAGMENT_SHADER;
4044 config.useFenceSync = useSync;
4045 config.serverSync = serverSync;
4048 config.render = false;
4049 shaderTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "frag_compile", "Create, set source, compile and delete shader"));
4052 group->addChild(shaderTests);
4056 TestCaseGroup* programTests = new TestCaseGroup(ctx, "programs", "Program management tests");
4059 GLES2ThreadedSharingTest::TestConfig config;
4061 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
4062 config.useFenceSync = useSync;
4063 config.serverSync = serverSync;
4066 config.render = false;
4067 programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_destroy", "Create and delete program"));
4071 GLES2ThreadedSharingTest::TestConfig config;
4073 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
4074 config.useFenceSync = useSync;
4075 config.serverSync = serverSync;
4078 config.render = false;
4079 programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "attach", "Create, attach shaders and delete program"));
4083 GLES2ThreadedSharingTest::TestConfig config;
4085 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_PROGRAM;
4086 config.useFenceSync = useSync;
4087 config.serverSync = serverSync;
4090 config.render = false;
4091 programTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "link", "Create, attach shaders, link and delete program"));
4094 group->addChild(programTests);
4098 TestCaseGroup* imageTests = new TestCaseGroup(ctx, "images", "Image management tests");
4100 TestCaseGroup* textureSourceTests = new TestCaseGroup(ctx, "texture_source", "Image management tests with texture source.");
4102 GLES2ThreadedSharingTest::TestConfig config;
4104 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4105 config.useFenceSync = useSync;
4106 config.serverSync = serverSync;
4109 config.render = false;
4110 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_destroy", "Create and destroy EGLImage."));
4114 GLES2ThreadedSharingTest::TestConfig config;
4116 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4117 config.useFenceSync = useSync;
4118 config.serverSync = serverSync;
4121 config.render = false;
4122 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_texture", "Create texture from image."));
4126 GLES2ThreadedSharingTest::TestConfig config;
4128 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4129 config.useFenceSync = useSync;
4130 config.serverSync = serverSync;
4133 config.render = false;
4134 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "texsubimage2d", "Modify texture created from image with glTexSubImage2D."));
4138 GLES2ThreadedSharingTest::TestConfig config;
4140 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4141 config.useFenceSync = useSync;
4142 config.serverSync = serverSync;
4145 config.render = false;
4146 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copytexsubimage2d", "Modify texture created from image with glCopyTexSubImage2D."));
4150 GLES2ThreadedSharingTest::TestConfig config;
4152 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4153 config.useFenceSync = useSync;
4154 config.serverSync = serverSync;
4157 config.render = false;
4158 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d", "Modify texture created from image with glTexImage2D."));
4162 GLES2ThreadedSharingTest::TestConfig config;
4164 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4165 config.useFenceSync = useSync;
4166 config.serverSync = serverSync;
4169 config.render = false;
4170 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d", "Modify texture created from image with glCopyTexImage2D."));
4174 GLES2ThreadedSharingTest::TestConfig config;
4176 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4177 config.useFenceSync = useSync;
4178 config.serverSync = serverSync;
4181 config.render = true;
4182 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "create_texture_render", "Create texture from image and render."));
4186 GLES2ThreadedSharingTest::TestConfig config;
4188 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4189 config.useFenceSync = useSync;
4190 config.serverSync = serverSync;
4193 config.render = true;
4194 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "texsubimage2d_render", "Modify texture created from image and render."));
4198 GLES2ThreadedSharingTest::TestConfig config;
4200 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4201 config.useFenceSync = useSync;
4202 config.serverSync = serverSync;
4205 config.render = true;
4206 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copytexsubimage2d_render", "Modify texture created from image and render."));
4210 GLES2ThreadedSharingTest::TestConfig config;
4212 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4213 config.useFenceSync = useSync;
4214 config.serverSync = serverSync;
4217 config.render = true;
4218 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "teximage2d_render", "Modify texture created from image and render."));
4222 GLES2ThreadedSharingTest::TestConfig config;
4224 config.resourceType = GLES2ThreadedSharingTest::TestConfig::RESOURCETYPE_IMAGE;
4225 config.useFenceSync = useSync;
4226 config.serverSync = serverSync;
4229 config.render = true;
4230 textureSourceTests->addChild(new GLES2ThreadedSharingTest(ctx, config, "copyteximage2d_render", "Modify texture created from image and render."));
4233 imageTests->addChild(textureSourceTests);
4235 group->addChild(imageTests);
4240 static void addRandomTests (EglTestContext& ctx, tcu::TestCaseGroup* group, bool useSync, bool serverSync)
4243 TestCaseGroup* textureTests = new TestCaseGroup(ctx, "textures", "Texture management tests");
4246 TestCaseGroup* genTextureTests = new TestCaseGroup(ctx, "gen_delete", "Texture gen and delete tests");
4248 for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
4250 GLES2SharingRandomTest::TestConfig config;
4251 config.useFenceSync = useSync;
4252 config.serverSync = serverSync;
4253 config.threadCount = 2 + textureTestNdx % 5;
4254 config.operationCount = 30 + textureTestNdx;
4256 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
4258 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4259 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.75f;
4261 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.5f;
4262 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.5f;
4264 std::string name = de::toString(textureTestNdx);
4265 genTextureTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4268 textureTests->addChild(genTextureTests);
4272 TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "teximage2d", "Texture gen, delete and teximage2D tests");
4274 for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
4276 GLES2SharingRandomTest::TestConfig config;
4277 config.useFenceSync = useSync;
4278 config.serverSync = serverSync;
4279 config.threadCount = 2 + textureTestNdx % 5;
4280 config.operationCount = 40 + textureTestNdx;
4282 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
4284 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.10f;
4285 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.10f;
4286 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.80f;
4288 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.30f;
4289 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.40f;
4290 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.30f;
4292 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.40f;
4293 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.40f;
4294 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.20f;
4296 std::string name = de::toString(textureTestNdx);
4297 texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4300 textureTests->addChild(texImage2DTests);
4304 TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "texsubimage2d", "Texture gen, delete, teximage2D and texsubimage2d tests");
4306 for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
4308 GLES2SharingRandomTest::TestConfig config;
4309 config.useFenceSync = useSync;
4310 config.serverSync = serverSync;
4311 config.threadCount = 2 + textureTestNdx % 5;
4312 config.operationCount = 50 + textureTestNdx;
4314 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
4316 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.05f;
4317 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.10f;
4318 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.80f;
4319 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.05f;
4321 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.30f;
4322 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.40f;
4323 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.20f;
4324 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
4326 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.20f;
4327 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.20f;
4328 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.10f;
4329 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.50f;
4331 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.20f;
4332 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4333 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.25f;
4334 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.30f;
4336 std::string name = de::toString(textureTestNdx);
4337 texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4340 textureTests->addChild(texSubImage2DTests);
4344 TestCaseGroup* copyTexImage2DTests = new TestCaseGroup(ctx, "copyteximage2d", "Texture gen, delete and copyteximage2d tests");
4346 for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
4348 GLES2SharingRandomTest::TestConfig config;
4349 config.useFenceSync = useSync;
4350 config.serverSync = serverSync;
4351 config.threadCount = 2 + textureTestNdx % 5;
4352 config.operationCount = 40 + textureTestNdx;
4354 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
4356 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.10f;
4357 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.10f;
4358 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.80f;
4360 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.30f;
4361 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.40f;
4362 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.30f;
4364 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.40f;
4365 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.40f;
4366 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.20f;
4369 std::string name = de::toString(textureTestNdx);
4370 copyTexImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4373 textureTests->addChild(copyTexImage2DTests);
4377 TestCaseGroup* copyTexSubImage2DTests = new TestCaseGroup(ctx, "copytexsubimage2d", "Texture gen, delete, teximage2D and copytexsubimage2d tests");
4379 for (int textureTestNdx = 0; textureTestNdx < 20; textureTestNdx++)
4381 GLES2SharingRandomTest::TestConfig config;
4382 config.useFenceSync = useSync;
4383 config.serverSync = serverSync;
4384 config.threadCount = 2 + textureTestNdx % 5;
4385 config.operationCount = 50 + textureTestNdx;
4387 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
4389 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.05f;
4390 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.10f;
4391 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.80f;
4392 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.05f;
4394 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.30f;
4395 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.40f;
4396 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.20f;
4397 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
4399 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.20f;
4400 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.20f;
4401 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.10f;
4402 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.50f;
4404 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.20f;
4405 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4406 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.25f;
4407 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.30f;
4410 std::string name = de::toString(textureTestNdx);
4411 copyTexSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4414 textureTests->addChild(copyTexSubImage2DTests);
4417 group->addChild(textureTests);
4419 TestCaseGroup* bufferTests = new TestCaseGroup(ctx, "buffers", "Buffer management tests");
4422 TestCaseGroup* genBufferTests = new TestCaseGroup(ctx, "gen_delete", "Buffer gen and delete tests");
4424 for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
4426 GLES2SharingRandomTest::TestConfig config;
4427 config.useFenceSync = useSync;
4428 config.serverSync = serverSync;
4429 config.threadCount = 2 + bufferTestNdx % 5;
4430 config.operationCount = 30 + bufferTestNdx;
4432 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER] = 1.0f;
4434 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER] = 0.25f;
4435 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER] = 0.75f;
4437 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER] = 0.5f;
4438 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER] = 0.5f;
4440 std::string name = de::toString(bufferTestNdx);
4441 genBufferTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4444 bufferTests->addChild(genBufferTests);
4448 TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "bufferdata", "Buffer gen, delete and bufferdata tests");
4450 for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
4452 GLES2SharingRandomTest::TestConfig config;
4453 config.useFenceSync = useSync;
4454 config.serverSync = serverSync;
4455 config.threadCount = 2 + bufferTestNdx % 5;
4456 config.operationCount = 40 + bufferTestNdx;
4458 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER] = 1.0f;
4460 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER] = 0.10f;
4461 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER] = 0.10f;
4462 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_DATA] = 0.80f;
4464 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER] = 0.30f;
4465 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER] = 0.40f;
4466 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_DATA] = 0.30f;
4468 config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_DESTROY_BUFFER] = 0.40f;
4469 config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_CREATE_BUFFER] = 0.40f;
4470 config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_DATA] = 0.20f;
4472 std::string name = de::toString(bufferTestNdx);
4473 texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4476 bufferTests->addChild(texImage2DTests);
4480 TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "buffersubdata", "Buffer gen, delete, bufferdata and bufferdata tests");
4482 for (int bufferTestNdx = 0; bufferTestNdx < 20; bufferTestNdx++)
4484 GLES2SharingRandomTest::TestConfig config;
4485 config.useFenceSync = useSync;
4486 config.serverSync = serverSync;
4487 config.threadCount = 2 + bufferTestNdx % 5;
4488 config.operationCount = 50 + bufferTestNdx;
4490 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_BUFFER] = 1.0f;
4492 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_DESTROY_BUFFER] = 0.05f;
4493 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_CREATE_BUFFER] = 0.10f;
4494 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_DATA] = 0.80f;
4495 config.probabilities[THREADOPERATIONID_CREATE_BUFFER][THREADOPERATIONID_BUFFER_SUBDATA] = 0.05f;
4497 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_DESTROY_BUFFER] = 0.30f;
4498 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_CREATE_BUFFER] = 0.40f;
4499 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_DATA] = 0.20f;
4500 config.probabilities[THREADOPERATIONID_DESTROY_BUFFER][THREADOPERATIONID_BUFFER_SUBDATA] = 0.10f;
4502 config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_DESTROY_BUFFER] = 0.20f;
4503 config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_CREATE_BUFFER] = 0.20f;
4504 config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_DATA] = 0.10f;
4505 config.probabilities[THREADOPERATIONID_BUFFER_DATA][THREADOPERATIONID_BUFFER_SUBDATA] = 0.50f;
4507 config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_DESTROY_BUFFER] = 0.20f;
4508 config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_CREATE_BUFFER] = 0.25f;
4509 config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_BUFFER_DATA] = 0.25f;
4510 config.probabilities[THREADOPERATIONID_BUFFER_SUBDATA][THREADOPERATIONID_BUFFER_SUBDATA] = 0.30f;
4512 std::string name = de::toString(bufferTestNdx);
4513 texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4516 bufferTests->addChild(texSubImage2DTests);
4519 group->addChild(bufferTests);
4521 TestCaseGroup* shaderTests = new TestCaseGroup(ctx, "shaders", "Shader management tests");
4524 TestCaseGroup* createShaderTests = new TestCaseGroup(ctx, "create_destroy", "Shader create and destroy tests");
4526 for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
4528 GLES2SharingRandomTest::TestConfig config;
4529 config.useFenceSync = useSync;
4530 config.serverSync = serverSync;
4531 config.threadCount = 2 + shaderTestNdx % 5;
4532 config.operationCount = 30 + shaderTestNdx;
4534 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.5f;
4535 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.5f;
4537 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4538 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.40f;
4539 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.40f;
4541 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4542 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.40f;
4543 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.40f;
4545 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.5f;
4546 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.25f;
4547 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.25f;
4549 std::string name = de::toString(shaderTestNdx);
4550 createShaderTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4553 shaderTests->addChild(createShaderTests);
4557 TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "source", "Shader create, destroy and source tests");
4559 for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
4561 GLES2SharingRandomTest::TestConfig config;
4562 config.useFenceSync = useSync;
4563 config.serverSync = serverSync;
4564 config.threadCount = 2 + shaderTestNdx % 5;
4565 config.operationCount = 40 + shaderTestNdx;
4567 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.5f;
4568 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.5f;
4570 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4571 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4572 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4573 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.50f;
4575 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4576 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4577 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4578 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.50f;
4580 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.30f;
4581 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.30f;
4582 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.30f;
4583 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4585 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4586 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4587 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4588 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE] = 0.40f;
4590 std::string name = de::toString(shaderTestNdx);
4591 texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4594 shaderTests->addChild(texImage2DTests);
4598 TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "compile", "Shader create, destroy, source and compile tests");
4600 for (int shaderTestNdx = 0; shaderTestNdx < 20; shaderTestNdx++)
4602 GLES2SharingRandomTest::TestConfig config;
4603 config.useFenceSync = useSync;
4604 config.serverSync = serverSync;
4605 config.threadCount = 2 + shaderTestNdx % 5;
4606 config.operationCount = 50 + shaderTestNdx;
4608 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.5f;
4609 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.5f;
4611 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4612 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.15f;
4613 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.15f;
4614 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.50f;
4615 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4617 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4618 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.15f;
4619 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.15f;
4620 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.50f;
4621 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4623 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.30f;
4624 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.25f;
4625 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.25f;
4626 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4627 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4629 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4630 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.10f;
4631 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.10f;
4632 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE] = 0.20f;
4633 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE] = 0.50f;
4635 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER] = 0.15f;
4636 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.15f;
4637 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.15f;
4638 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE] = 0.30f;
4639 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE] = 0.30f;
4641 std::string name = de::toString(shaderTestNdx);
4642 texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4645 shaderTests->addChild(texSubImage2DTests);
4648 group->addChild(shaderTests);
4650 TestCaseGroup* programTests = new TestCaseGroup(ctx, "programs", "Program management tests");
4653 TestCaseGroup* createProgramTests = new TestCaseGroup(ctx, "create_destroy", "Program create and destroy tests");
4655 for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
4657 GLES2SharingRandomTest::TestConfig config;
4658 config.useFenceSync = useSync;
4659 config.serverSync = serverSync;
4660 config.threadCount = 2 + programTestNdx % 5;
4661 config.operationCount = 30 + programTestNdx;
4663 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM] = 1.0f;
4665 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM] = 0.25f;
4666 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM] = 0.75f;
4668 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM] = 0.5f;
4669 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM] = 0.5f;
4671 std::string name = de::toString(programTestNdx);
4672 createProgramTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4675 programTests->addChild(createProgramTests);
4679 TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "attach_detach", "Program create, destroy, attach and detach tests");
4681 for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
4683 GLES2SharingRandomTest::TestConfig config;
4684 config.useFenceSync = useSync;
4685 config.serverSync = serverSync;
4686 config.threadCount = 2 + programTestNdx % 5;
4687 config.operationCount = 60 + programTestNdx;
4689 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.35f;
4690 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.35f;
4691 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM] = 0.30f;
4693 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4694 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.10f;
4695 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.10f;
4696 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.30f;
4697 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4698 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4699 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.05f;
4700 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.15f;
4702 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4703 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.10f;
4704 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.10f;
4705 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.30f;
4706 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4707 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4708 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.05f;
4709 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.15f;
4711 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4712 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4713 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4714 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4715 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4716 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.15f;
4717 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.15f;
4718 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.15f;
4720 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4721 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.10f;
4722 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.10f;
4723 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE] = 0.20f;
4724 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE] = 0.50f;
4725 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4726 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_PROGRAM] = 0.10f;
4727 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_ATTACH_SHADER] = 0.25f;
4729 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER] = 0.15f;
4730 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.15f;
4731 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.15f;
4732 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE] = 0.30f;
4733 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE] = 0.30f;
4734 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4735 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_PROGRAM] = 0.10f;
4736 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_ATTACH_SHADER] = 0.35f;
4738 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4739 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4740 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4741 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_SOURCE] = 0.05f;
4742 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_COMPILE] = 0.05f;
4743 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM] = 0.15f;
4744 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM] = 0.05f;
4745 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_ATTACH_SHADER] = 0.40f;
4747 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4748 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4749 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4750 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4751 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4752 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM] = 0.20f;
4753 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM] = 0.15f;
4754 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_ATTACH_SHADER] = 0.10f;
4756 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4757 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4758 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4759 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4760 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4761 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.15f;
4762 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.15f;
4763 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.30f;
4765 std::string name = de::toString(programTestNdx);
4766 texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4769 programTests->addChild(texImage2DTests);
4773 TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "link", "Program create, destroy, attach and link tests");
4775 for (int programTestNdx = 0; programTestNdx < 20; programTestNdx++)
4777 GLES2SharingRandomTest::TestConfig config;
4778 config.useFenceSync = useSync;
4779 config.serverSync = serverSync;
4780 config.threadCount = 2 + programTestNdx % 5;
4781 config.operationCount = 70 + programTestNdx;
4783 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.35f;
4784 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.35f;
4785 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_PROGRAM] = 0.30f;
4787 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4788 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.10f;
4789 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.10f;
4790 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.30f;
4791 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4792 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4793 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.05f;
4794 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.15f;
4795 config.probabilities[THREADOPERATIONID_CREATE_VERTEX_SHADER][THREADOPERATIONID_LINK_PROGRAM] = 0.10f;
4797 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4798 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.10f;
4799 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.10f;
4800 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.30f;
4801 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4802 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4803 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.05f;
4804 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.15f;
4805 config.probabilities[THREADOPERATIONID_CREATE_FRAGMENT_SHADER][THREADOPERATIONID_LINK_PROGRAM] = 0.10f;
4807 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4808 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4809 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4810 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4811 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4812 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.15f;
4813 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.15f;
4814 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.15f;
4815 config.probabilities[THREADOPERATIONID_DESTROY_SHADER][THREADOPERATIONID_LINK_PROGRAM] = 0.10f;
4817 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4818 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.10f;
4819 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.10f;
4820 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_SOURCE] = 0.20f;
4821 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_SHADER_COMPILE] = 0.50f;
4822 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4823 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_DESTROY_PROGRAM] = 0.10f;
4824 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_ATTACH_SHADER] = 0.25f;
4825 config.probabilities[THREADOPERATIONID_SHADER_SOURCE][THREADOPERATIONID_LINK_PROGRAM] = 0.20f;
4827 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_SHADER] = 0.15f;
4828 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.15f;
4829 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.15f;
4830 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_SOURCE] = 0.30f;
4831 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_SHADER_COMPILE] = 0.30f;
4832 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_CREATE_PROGRAM] = 0.10f;
4833 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_DESTROY_PROGRAM] = 0.10f;
4834 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_ATTACH_SHADER] = 0.35f;
4835 config.probabilities[THREADOPERATIONID_SHADER_COMPILE][THREADOPERATIONID_LINK_PROGRAM] = 0.20f;
4837 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_SHADER] = 0.10f;
4838 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4839 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4840 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_SOURCE] = 0.05f;
4841 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_SHADER_COMPILE] = 0.05f;
4842 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM] = 0.15f;
4843 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM] = 0.05f;
4844 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_ATTACH_SHADER] = 0.40f;
4845 config.probabilities[THREADOPERATIONID_CREATE_PROGRAM][THREADOPERATIONID_LINK_PROGRAM] = 0.05f;
4847 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4848 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4849 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4850 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4851 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4852 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM] = 0.20f;
4853 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM] = 0.15f;
4854 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_ATTACH_SHADER] = 0.10f;
4855 config.probabilities[THREADOPERATIONID_DESTROY_PROGRAM][THREADOPERATIONID_LINK_PROGRAM] = 0.05f;
4857 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4858 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4859 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4860 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4861 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4862 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_CREATE_PROGRAM] = 0.15f;
4863 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_DESTROY_PROGRAM] = 0.15f;
4864 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_ATTACH_SHADER] = 0.30f;
4865 config.probabilities[THREADOPERATIONID_ATTACH_SHADER][THREADOPERATIONID_LINK_PROGRAM] = 0.30f;
4867 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_DESTROY_SHADER] = 0.20f;
4868 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_VERTEX_SHADER] = 0.20f;
4869 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_FRAGMENT_SHADER] = 0.20f;
4870 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_SHADER_SOURCE] = 0.10f;
4871 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_SHADER_COMPILE] = 0.10f;
4872 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_CREATE_PROGRAM] = 0.20f;
4873 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_DESTROY_PROGRAM] = 0.15f;
4874 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_ATTACH_SHADER] = 0.10f;
4875 config.probabilities[THREADOPERATIONID_LINK_PROGRAM][THREADOPERATIONID_LINK_PROGRAM] = 0.05f;
4877 std::string name = de::toString(programTestNdx);
4878 texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4881 programTests->addChild(texSubImage2DTests);
4884 group->addChild(programTests);
4886 TestCaseGroup* imageTests = new TestCaseGroup(ctx, "images", "Image management tests");
4889 TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "create_destroy", "Image gen, delete and teximage2D tests");
4891 for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
4893 GLES2SharingRandomTest::TestConfig config;
4894 config.useFenceSync = useSync;
4895 config.serverSync = serverSync;
4896 config.threadCount = 2 + imageTestNdx % 5;
4897 config.operationCount = 70 + imageTestNdx;
4898 config.useImages = true;
4900 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
4902 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.10f;
4903 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.15f;
4904 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.40f;
4905 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.35f;
4906 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.30f;
4908 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.15f;
4909 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.20f;
4910 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.40f;
4911 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.35f;
4912 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4914 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4915 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4916 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.40f;
4917 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.35f;
4918 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4920 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4921 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4922 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.40f;
4923 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.35f;
4924 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4926 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4927 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4928 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.40f;
4929 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE] = 0.35f;
4930 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4932 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4933 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4934 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.30f;
4935 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
4936 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4938 std::string name = de::toString(imageTestNdx);
4939 texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
4942 imageTests->addChild(texImage2DTests);
4946 TestCaseGroup* texImage2DTests = new TestCaseGroup(ctx, "teximage2d", "Image gen, delete and teximage2D tests");
4948 for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
4950 GLES2SharingRandomTest::TestConfig config;
4951 config.useFenceSync = useSync;
4952 config.serverSync = serverSync;
4953 config.threadCount = 2 + imageTestNdx % 5;
4954 config.operationCount = 70 + imageTestNdx;
4955 config.useImages = true;
4957 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
4959 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.10f;
4960 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.15f;
4961 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.20f;
4962 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
4963 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.30f;
4964 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.20f;
4966 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.15f;
4967 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.20f;
4968 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.15f;
4969 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
4970 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4971 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
4973 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4974 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4975 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
4976 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
4977 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4978 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
4980 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4981 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4982 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
4983 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
4984 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4985 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
4987 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4988 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4989 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
4990 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
4991 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4992 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
4994 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
4995 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
4996 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
4997 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
4998 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
4999 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5001 std::string name = de::toString(imageTestNdx);
5002 texImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
5005 imageTests->addChild(texImage2DTests);
5009 TestCaseGroup* texSubImage2DTests = new TestCaseGroup(ctx, "texsubimage2d", "Image gen, delete, teximage2D and texsubimage2d tests");
5011 for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
5013 GLES2SharingRandomTest::TestConfig config;
5014 config.useFenceSync = useSync;
5015 config.serverSync = serverSync;
5016 config.threadCount = 2 + imageTestNdx % 5;
5017 config.operationCount = 70 + imageTestNdx;
5018 config.useImages = true;
5020 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
5022 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.10f;
5023 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.15f;
5024 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.20f;
5025 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
5026 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.30f;
5027 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.20f;
5028 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
5030 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.15f;
5031 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.20f;
5032 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.15f;
5033 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
5034 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5035 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5036 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
5038 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5039 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5040 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5041 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5042 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5043 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5044 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
5046 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5047 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5048 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5049 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5050 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5051 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5052 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
5054 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5055 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5056 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5057 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5058 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5059 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5060 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
5062 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5063 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5064 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5065 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5066 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5067 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5068 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
5070 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5071 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5072 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5073 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5074 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5075 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5076 config.probabilities[THREADOPERATIONID_TEXSUBIMAGE2D][THREADOPERATIONID_TEXSUBIMAGE2D] = 0.10f;
5078 std::string name = de::toString(imageTestNdx);
5079 texSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
5082 imageTests->addChild(texSubImage2DTests);
5086 TestCaseGroup* copyTexImage2DTests = new TestCaseGroup(ctx, "copyteximage2d", "Image gen, delete and copyteximage2d tests");
5088 for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
5090 GLES2SharingRandomTest::TestConfig config;
5091 config.useFenceSync = useSync;
5092 config.serverSync = serverSync;
5093 config.threadCount = 2 + imageTestNdx % 5;
5094 config.operationCount = 70 + imageTestNdx;
5095 config.useImages = true;
5097 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
5099 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.10f;
5100 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.15f;
5101 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.20f;
5102 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
5103 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.30f;
5104 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.20f;
5106 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.15f;
5107 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.20f;
5108 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.15f;
5109 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
5110 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.15f;
5111 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5113 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5114 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5115 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5116 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5117 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.15f;
5118 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5120 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5121 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5122 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5123 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5124 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.15f;
5125 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5127 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5128 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5129 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5130 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5131 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.15f;
5132 config.probabilities[THREADOPERATIONID_COPYTEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5134 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5135 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5136 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5137 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5138 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_COPYTEXIMAGE2D] = 0.15f;
5139 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5141 std::string name = de::toString(imageTestNdx);
5142 copyTexImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
5145 imageTests->addChild(copyTexImage2DTests);
5149 TestCaseGroup* copyTexSubImage2DTests = new TestCaseGroup(ctx, "copytexsubimage2d", "Image gen, delete, teximage2D and copytexsubimage2d tests");
5151 for (int imageTestNdx = 0; imageTestNdx < 20; imageTestNdx++)
5153 GLES2SharingRandomTest::TestConfig config;
5154 config.useFenceSync = useSync;
5155 config.serverSync = serverSync;
5156 config.threadCount = 2 + imageTestNdx % 5;
5157 config.operationCount = 70 + imageTestNdx;
5158 config.useImages = true;
5160 config.probabilities[THREADOPERATIONID_NONE][THREADOPERATIONID_CREATE_TEXTURE] = 1.0f;
5162 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.10f;
5163 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.15f;
5164 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.20f;
5165 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
5166 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.30f;
5167 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.20f;
5168 config.probabilities[THREADOPERATIONID_CREATE_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
5170 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.15f;
5171 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.20f;
5172 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.15f;
5173 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.15f;
5174 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5175 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5176 config.probabilities[THREADOPERATIONID_DESTROY_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
5178 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5179 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5180 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5181 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5182 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5183 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5184 config.probabilities[THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
5186 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5187 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5188 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5189 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5190 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5191 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5192 config.probabilities[THREADOPERATIONID_DESTROY_IMAGE][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
5194 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5195 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5196 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5197 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5198 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5199 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5200 config.probabilities[THREADOPERATIONID_TEXIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
5202 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5203 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5204 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5205 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5206 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5207 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5208 config.probabilities[THREADOPERATIONID_TEXTURE_FROM_IMAGE][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
5210 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_TEXTURE] = 0.25f;
5211 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_TEXTURE] = 0.25f;
5212 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_CREATE_IMAGE_FROM_TEXTURE] = 0.25f;
5213 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_DESTROY_IMAGE] = 0.25f;
5214 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXIMAGE2D] = 0.15f;
5215 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_TEXTURE_FROM_IMAGE] = 0.15f;
5216 config.probabilities[THREADOPERATIONID_COPYTEXSUBIMAGE2D][THREADOPERATIONID_COPYTEXSUBIMAGE2D] = 0.10f;
5219 std::string name = de::toString(imageTestNdx);
5220 copyTexSubImage2DTests->addChild(new GLES2SharingRandomTest(ctx, config, name.c_str(), name.c_str()));
5223 imageTests->addChild(copyTexSubImage2DTests);
5226 group->addChild(imageTests);
5230 GLES2SharingThreadedTests::GLES2SharingThreadedTests (EglTestContext& eglTestCtx)
5231 : TestCaseGroup(eglTestCtx, "multithread", "EGL GLES2 sharing multithread tests")
5235 void GLES2SharingThreadedTests::init (void)
5237 tcu::TestCaseGroup* simpleTests = new TestCaseGroup(m_eglTestCtx, "simple", "Simple multithreaded tests");
5238 addSimpleTests(m_eglTestCtx, simpleTests, false, false);
5239 addChild(simpleTests);
5241 TestCaseGroup* randomTests = new TestCaseGroup(m_eglTestCtx, "random", "Random tests");
5242 addRandomTests(m_eglTestCtx, randomTests, false, false);
5243 addChild(randomTests);
5245 tcu::TestCaseGroup* simpleTestsSync = new TestCaseGroup(m_eglTestCtx, "simple_egl_sync", "Simple multithreaded tests with EGL_KHR_fence_sync");
5246 addSimpleTests(m_eglTestCtx, simpleTestsSync, true, false);
5247 addChild(simpleTestsSync);
5249 TestCaseGroup* randomTestsSync = new TestCaseGroup(m_eglTestCtx, "random_egl_sync", "Random tests with EGL_KHR_fence_sync");
5250 addRandomTests(m_eglTestCtx, randomTestsSync, true, false);
5251 addChild(randomTestsSync);
5253 tcu::TestCaseGroup* simpleTestsServerSync = new TestCaseGroup(m_eglTestCtx, "simple_egl_server_sync", "Simple multithreaded tests with EGL_KHR_fence_sync and EGL_KHR_wait_sync");
5254 addSimpleTests(m_eglTestCtx, simpleTestsServerSync, true, true);
5255 addChild(simpleTestsServerSync);
5257 TestCaseGroup* randomTestsServerSync = new TestCaseGroup(m_eglTestCtx, "random_egl_server_sync", "Random tests with EGL_KHR_fence_sync and EGL_KHR_wait_sync");
5258 addRandomTests(m_eglTestCtx, randomTestsServerSync, true, true);
5259 addChild(randomTestsServerSync);