From 0ef7b7154f6d4498077a83db5c486c61bc34938c Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Tue, 31 Oct 2017 15:30:10 +0200 Subject: [PATCH] [test] Added GLContextMode.Shared utest --- cmake/test-files.cmake | 1 + test/fixtures/shared_context/expected.png | Bin 0 -> 6109 bytes test/gl/context.test.cpp | 114 ++++++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 test/fixtures/shared_context/expected.png create mode 100644 test/gl/context.test.cpp diff --git a/cmake/test-files.cmake b/cmake/test-files.cmake index 1aee6223b..3f11e75e0 100644 --- a/cmake/test-files.cmake +++ b/cmake/test-files.cmake @@ -23,6 +23,7 @@ set(MBGL_TEST_FILES # gl test/gl/bucket.test.cpp test/gl/object.test.cpp + test/gl/context.test.cpp # include/mbgl test/include/mbgl/test.hpp diff --git a/test/fixtures/shared_context/expected.png b/test/fixtures/shared_context/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3fd0e315c952f216a252b2b17fa3c233fd3908 GIT binary patch literal 6109 zcmXw7c_38p*S}*J*`g@>UY3+KTlTDF&k|)zvV;jSmNAT!ohXq+_I+COz32Iy&pFR?&U2n~pJ)>!T?SeXS^xkTZs}>=0RRa23IWc*z=w@b zkuw0W=H1fLFb{Z7B=`qg_`QQ|3iJDhG4g4fGqL^9V8xbA)5eXBCVVLsxl)>NT5T*PFiEkYhyaG7e8dmQ+K7sWg8# zZYVCHK1?8eXk)@ov~nOMQrKXjVIA9Gip8g^!=~nCwl0rOIMeH>KQ?mk%gZm{z@#Vi znz9xexiP+|yvHy2QSD@oKuXD1Im`94qFOp53BmW4xT|{ck~ARVB=oRF97@OJnP#g z8)O#Ll&-SxihJ7iJ!<86hT@qqJ1G&-2Y`v5b}q&o`4;MTrd3VCJ&hx`f5&UY`|`-AGTa(WsOC!8I3&r(*^#gpmu8cmC^B+Hvt10de zEEByN5!CByY!#k6@@2Q3fkZ(ae*SLkgD?DkOQQ5|x4D{*vqfv3Vj?G4i`nY*QWk=D z-d(I1J)#l3_}rbdy#3H#3g|MG3fT5XmM?t#wC8oW3h@{hmA$LsHm%fqlo%)EJu|6e zD)I<0*{2-xidp49HD}B_THaZ6g}+{@_iby}Gj;(I=P=ax>tuevyDrLd)<~>PY$op? z8#0TH+#Re#&7h6Vb(=lvhUa;G_}0SwYY7D|j+@Fv&zbTwQ0K!Y`cpFRc$y$}NEwbw z6B8?Zn3vlDtmL}A#g@?cl#NNTm3=fZk%Zmtbgw+DG1v62wuej`VgqV^ImaE|K`OMa zh3-phLNi*pHe^4cd9s!0>e8CS5B{UK#4$s8b* zEn#hPt9ehlss6&lix~&=8P$cox$zu=!sK%kN*c(SZZ1;z?2UD`OU;*;V+fX+wro*! zTVI9WtsVPtsdBsmm}<68Vq~X~nMdrwb@@5MG3_x7_;_9CE0r!4olPGwk#fmS&X|$v zP^FXLGXSF^;+|a=gw)ee5?$xTbE3DGSXXc@X)Ar3)~@9p3o*>^8JA~Kb;8=*FnaZpGN*13nmYAei`Lf9(m9p%MG5Wz&xzxXTHuQjfO(XtcxO7eU9`42i zntP1HHibSYtzm#Eb*7)!O`bK)Q%;}?Mo=x0#!W&>*ph_!Kel)$h0>d zg7~HphiA}rrdeuNG~nBypB;GM8@Q&4;K__FTPN{I2y?`@=hUh_Ts}e$c)kiA>e4V+ zPwRhZ0|a#4Z<2|9lS^C6ndIB`>pn4iXj4+o(^$RKp3HnHdwe=XkA6Q!)xy+9pgDhA z`9n3ti=}n3$HHm;Of_dUvU$nVNPG0Du>T;Bj^PuBVV$%{6O}1`%z7Bk zWHum4qY+*6C<_k|g)YO;hsCU$NKfx|7b5Jki}trS;k|`+>f`hGmhgtRzb76m}B((OjJbTX6Rlf=jCXP+x3pT8a%1POcHBkCqE zN#!DhPZ;=}+XZ?*JzsMh&tTBft?65a;MJDfrJx{RZ6f3la4gDGm3Erh;G#IpzgzpM zJYIBB%wK01?npafq2Q~9{UDGEGPM1rGHV1+h*8M0dNxEU1M`s@bLy=fxL9*YY&Beidd)L2Pw42 zMp>;o<`ue=jh##+aMp}-O*HsEgRtW0n|5M2Z;)z@-(x(R(8cn$Y59f@Hgv+c5m?I4 zg>A^VmY;mAJ?tcaE=(fg4sJFli8A>+=)Oao)~AE^Vl^Xw{IwUY<5v7n^a}P9T!&tn z`Z*QiiMQG=#d|-9v~h21*@f1`D!U5a0V=n{TF&%f8F2Ft{^livfjFAqN7s3)s9k)2 z!rIO;Ujskidwz%~GjuHq)eu`XH$*oehZl^WkbANkUa90jInmcA-S z5o6BcrdWi!_LD7p?OC$2j3gJRG79T_36}kCnf>3X?(~a%LY99E4$Uo}J4r{)5)6%; zyRhAs_=gJ_?MN%kqM>gfS;Fcxe2Mf(M~V;7vS3L~uCwLfQ!~cO|6PrzdS}|Q=0_vS z;=fY#Pvx`o>XKd_GBrCWR3JMCaT2qO-h{+2GPH$aM}EVy3ISHAnmXY%|Ae zW;kx{^>E~`8bE=1T)4LG@?Q%AN)4tPxst%-3<5+r6 zb&yK<)ytPWFUBXPa~^H8SEPk7w?V z(I6Qq$-%IziSZFRtx7HQQRR@$GruziDAKI`OuW8rBadz{7Gvkv zE@Z@98+9F+jF9{FGKo%kjkIC)S!#1h+Tnpma-_!7A?jbfQ;miDFfC zi;iRVnNFsRQtp=;;>c=b@bnk{v|$G}K2E3t$B7(VW+$4eI_Z7c`E{?00$)z=*hubZ zOsGjQhc5-5W&1)yPrvm zy7Gzk#yxwVc@9HJr(3YA=y=QNXZ&GjLpYUBZ!xe~1a+@rt32z-r#-|0B|)P4Sj3bV zWkrV>FX^uT;;WZVVJai&S>Am&1h6YtC-BUX)f@gX_~XF(nskZILY~YUj#i@sp?xHL&tp< zpjMs>a$>Fv~ziCo3a{P-BLL{ZHC;8K=@ZMXA_~ zMT;b*fwhZT(PNYuP#oFoeBHH4{KtLXUNcKdqg(`>ZXhFUlE$uNXZldP#W|gYjuQgbx}!Nuk<{KJmE@wtO0{Q5;pEWLAgCpWw)jR* z@!{9!V&Zi=Ivw$2jiecIIM1(a3NhNyOp%@26bsXDxI@;QwGqp;PbcI)6fvaMtL8M@PLxtfT`1+~wV?o15KcAbR>ILu~@rC5%ybsKw)zm(*NeeG0eMa$71n5l_q z=r$hxW>+dlOV{whOdK-BruezW-*&I&@II1(_0Dd^{$4uC9^dgtSr^LS{2zXQBB-1O1PisPsyR#1MscMs@pXowwa;m)je>{o!z@L=> zQGXyayZGFX9{4B;hHb9aU zisl-Aa`2&JpBwl)FkboSIF1>@pauoC_YQX(LL<=CY`}a}{!3KD^`aRU0QAG??sXO4 z>&r7Pf1NVo=L~@XQ1p6D;b_qdeg+`o@5eyx@NX19@Bc=6d!&>o>`RMu?a?|6Ol)Oaa_NqyuUG< zaUHvb!us7SJLV~gVcwiDbgXQpzrb3_)3e-)b#TkQ%keKyCO&K9!%n~KL~>X9TD|`H zu!S(E0^K92!P$|-K& zy-@w)a`L$Rf!}+G=9~~ckh(GnAC%kWe{{ww95O9HQnW`YumhG4fciG;VOrWD>eu`Z z+%R-|PVQ~}NBt*Cb>g?~@anGU#m#tc46;e;eR2e>E?rs0oXU?! zQNrk7m4n3HA=ls)f2z{Hp&!(MC0@XjgGa4G)wMv{;jKp-P^I@8uc){h?ko+3eUqaH zVwI77{%S>xY2EZ}BEKYot9Le?*SU82WilX|kCN0S_d5xnX4%s{(whh!_>aHNrw_zhOa24td zg~ED$!TH5EK1}*pH{(P1@0)PgS&kiw?70Y|PwNIJ@Yq64aNU2oIt8NXEDb}yD7hRN9*R~r<8W@z5I?vQfR7EgLE?r z7pIdD>2uye!#Wdml~fvV*D2~<{-bGe}b5~J73{fUim z(rdHKd%jD^v}0I5C*tYXpa}F+aKTo`f~PcyGYl^j8T+-v9l^pUQ*G_D>L-aPpNqt6rt zNgsp#jwUidQ{%VC)t>Ev%l8q%O>;R9e1cn<>3(x;SbtB+wSWH&@Hz|5rf=0LV~A(c zB#Kz$7(TJsaPQ6RtW4@w#3C}(XT6qzO_dpp&v2G=Nao(=jR$`iQxl4m@-})+>w;^) z{}`2a*f+odRp!LUFR1XXk5!;B6HbtnlwyrSd${0$#}C11+%~6q!t#yD0njS3Pw11+ z3hRP{S>-0rIQ|miP_3-h`B)uo(GP%|!9ce@G?JnpQr6mTV*lLmhl&0X&ikx zW&BT5&&+9iHg%pAEbnbu qF_8e=La!wx-cWnb0jM|d zYd9%Jm?f!z$d61i0Wt<8aA_ae;lA|!KLWg2Eh3mZF~ZP2U7ppo=`rgqAjcJvg%*t%#4;Mu5JUT + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace mbgl; +using namespace mbgl::style; + +static const GLchar* vertexShaderSource = R"MBGL_SHADER( +#ifdef GL_ES +precision mediump float; +#endif +attribute vec2 a_pos; +void main() { + gl_Position = vec4(a_pos, 0, 1); +} +)MBGL_SHADER"; + +static const GLchar* fragmentShaderSource = R"MBGL_SHADER( +#ifdef GL_ES +precision mediump float; +#endif +void main() { + gl_FragColor = vec4(0, 1, 0, 1); +} +)MBGL_SHADER"; + +struct Shader { + Shader(const GLchar* vertex, const GLchar* fragment) { + program = MBGL_CHECK_ERROR(glCreateProgram()); + vertexShader = MBGL_CHECK_ERROR(glCreateShader(GL_VERTEX_SHADER)); + fragmentShader = MBGL_CHECK_ERROR(glCreateShader(GL_FRAGMENT_SHADER)); + MBGL_CHECK_ERROR(glShaderSource(vertexShader, 1, &vertex, nullptr)); + MBGL_CHECK_ERROR(glCompileShader(vertexShader)); + MBGL_CHECK_ERROR(glAttachShader(program, vertexShader)); + MBGL_CHECK_ERROR(glShaderSource(fragmentShader, 1, &fragment, nullptr)); + MBGL_CHECK_ERROR(glCompileShader(fragmentShader)); + MBGL_CHECK_ERROR(glAttachShader(program, fragmentShader)); + MBGL_CHECK_ERROR(glLinkProgram(program)); + a_pos = MBGL_CHECK_ERROR(glGetAttribLocation(program, "a_pos")); + } + + ~Shader() { + MBGL_CHECK_ERROR(glDetachShader(program, vertexShader)); + MBGL_CHECK_ERROR(glDetachShader(program, fragmentShader)); + MBGL_CHECK_ERROR(glDeleteShader(vertexShader)); + MBGL_CHECK_ERROR(glDeleteShader(fragmentShader)); + MBGL_CHECK_ERROR(glDeleteProgram(program)); + } + + GLuint program = 0; + GLuint vertexShader = 0; + GLuint fragmentShader = 0; + GLuint a_pos = 0; +}; + +struct Buffer { + Buffer(std::vector data) { + MBGL_CHECK_ERROR(glGenBuffers(1, &buffer)); + MBGL_CHECK_ERROR(glBindBuffer(GL_ARRAY_BUFFER, buffer)); + MBGL_CHECK_ERROR(glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(GLfloat), data.data(), + GL_STATIC_DRAW)); + } + + ~Buffer() { + MBGL_CHECK_ERROR(glDeleteBuffers(1, &buffer)); + } + + GLuint buffer = 0; +}; + +TEST(GLContextMode, Shared) { + util::RunLoop loop; + + DefaultFileSource fileSource(":memory:", "test/fixtures/api/assets"); + ThreadPool threadPool(4); + float pixelRatio { 1 }; + + HeadlessFrontend frontend { pixelRatio, fileSource, threadPool, {}, GLContextMode::Shared }; + + Map map(frontend, MapObserver::nullObserver(), frontend.getSize(), pixelRatio, fileSource, threadPool, MapMode::Still); + map.getStyle().loadJSON(util::read_file("test/fixtures/api/water.json")); + map.setLatLngZoom({ 37.8, -122.5 }, 10); + + // Set transparent background layer. + map.getStyle().getLayer("background")->as()->setBackgroundColor( { { 1.0f, 0.0f, 0.0f, 0.5f } } ); + + { + // Custom rendering outside of GL Native render loop. + BackendScope scope { *frontend.getBackend() }; + frontend.getBackend()->bind(); + + Shader paintShader(vertexShaderSource, fragmentShaderSource); + Buffer triangleBuffer({ 0, 0.5, 0.5, -0.5, -0.5, -0.5 }); + MBGL_CHECK_ERROR(glUseProgram(paintShader.program)); + MBGL_CHECK_ERROR(glBindBuffer(GL_ARRAY_BUFFER, triangleBuffer.buffer)); + MBGL_CHECK_ERROR(glEnableVertexAttribArray(paintShader.a_pos)); + MBGL_CHECK_ERROR(glVertexAttribPointer(paintShader.a_pos, 2, GL_FLOAT, GL_FALSE, 0, nullptr)); + MBGL_CHECK_ERROR(glDrawArrays(GL_TRIANGLE_STRIP, 0, 3)); + } + + test::checkImage("test/fixtures/shared_context", frontend.render(map), 0.5, 0.1); +}