text:
Opinion • Ciênc. saúde colet. 24 (2) Feb 2019 • https://doi.org/10.1590/1413-81232018242.01662017 copy
Feminisms and men in the Brazilian context: provocations from the 13th AWID International Forum
Benedito Medrado
Departamento de Psicologia, Centro de Filosofia e Ciências Humanas, Universidade Federal de Pernambuco. R. Acadêmico Hélio Ramos s/n, Cidade Universitária. 50740-530 Recife PE Brasil. beneditomedrado@gmail.com
Marcos Nascimento
Instituto Nacional de Saúde da Mulher da Criança e do Adolescente Fernandes Figueira. Rio de Janeiro RJ Brasil.
Jorge Lyra
This paper shows some reflections based on the authors' participation in the AWID (Association for Women's Rights in Development) Forum, which took place in Brazil, in September 2016. These reflections provide key issues about principles and controversies in the work of research and activism on/with men and feminisms, based on the long path of work on masculinities and gender equality of these authors. From the field studies and political interventions on men and masculinities that take feminism as a theoretical and ethical-political framework, we discuss the production of masculinities in the feminist social transformation in contexts that are increasingly conservative and marked by male chauvinism and patriarchy. We also discussed how gender hierarchy emerges vigorously in the contemporary Brazilian political context, from the impeachment process of former president Dilma Rousseff to the formulation ofcurrent education and health policies.
Gender; Feminism; Men
In this text, we share some of the concerns and provocations that occurred during our participation in the 13th AWID (Association for Women's Rights in Development) International Forum, a global feminist gathering, held in the period September 8-11, 2016 in Costa do Sauípe, Bahia, Brazil. This forum is held every 3-4 years, in a different part of the world, including cities like Istanbul/Turkey, Cape Town/South Africa, Bangkok/Thailand, and Guadalajara/Mexico. Some of the relevant objectives of the Forum were: "1) the celebration of the achievements of the last twenty years by several social movements and critically analyze the ensuing learning; 2) the assessment of the current reality to identify opportunities and threats regarding the promotion of the rights of women and other oppressed groups; c) the search for strategies to strengthen solidarity and collective power among the various movements; 4) inspiration, energy and renewal of strength and purpose"11. AWID International Forum. Co-Creating Feminist Realities. [acessado 2016 Out 25]. Disponível em: http://www.forum.awid.org/forum16/
http://www.forum.awid.org/forum16/... . First scheduled for May 2016, the event was postponed due to the ZIKA epidemic.
Initially considered a local problem (in the Brazilian Northeast), the epidemic quickly became a global issue22. Diniz D. Zika: do sertão nordestino à ameaça global. Rio de Janeiro: Civilização Brasileira; 2016., affecting the lives of countless women and with many discussions, especially on bioethics and sexual and reproductive rights, promoted by feminist and women movements33. Pitanguy J. Os direitos reprodutivos das mulheres e a epidemia do Zika vírus. Cad Saúde Pública [Internet]. 2016 [citado 2016 Out 25]; 32(5). Disponível em: http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0102-311X2016000500603&lng=pt
http://www.scielo.br/scielo.php?script=s... ,44. Galli B, Deslandes S. Threats of retrocession in sexual and reproductive health policies in Brazil during the Zika epidemic. Cad Saúde Pública [Internet]. 2016 [citado 2016 Out 26]; 32(4):e00031116. Disponível em: http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0102-311X2016000400301&lng=pt.
http://www.scielo.br/scielo.php?script=s... . Finally, the Forum was staged in September, gathering about 2,000 participants from a wide variety of movements, sectors and countries. In this meeting, the theme of which was "Feminist Futures: Building Collective Power for Rights and Justice", we highlight the presence of traditionally sidelined and underrepresented groups in collective spaces of discussion, among which are young feminist activists; black and indigenous women; sex workers; women with disabilities; and trans, intersex and migrant activists. Also, if in previous forums, male presence was shy, this edition evidenced an expressive number of cis and trans men dialoguing with different groups around issues related to social justice and with specific spaces focused on reflections on male participation on topics that are dear to feminism and collective health in the Brazilian context, such as sexual and reproductive rights; the prevention of violence against women and girls in private and public spaces; social participation in addressing health inequalities, which are among the most relevant. Moreover, among these men, we were the three activist-researchers who, for several years, dedicated themselves to the development of collective actions, research and networking in order to work with men, from a strong attachment to feminist principles and horizons.
These initiatives build on a number of assumptions, among which are: 1) the recognition that the feminist project of social transformation is part of a broad movement for the symbolic and institutional reconfiguration and practices that subordinate women and the feminine; (2) the claim that such a transformation also requires substantial changes in the way men and masculinities are produced in our society, that is, we should review the several ways in which sexism and patriarchy conform to our daily lives and our institutions, values and symbols. Thus, as a strategy for thinking about limits and possibilities for the integration of men in the feminist struggle, we proposed to the Forum a specific session entitled "Feminisms and men: transforming practices, institutions and symbols". This proposal sought to dialogue with the discussion axes of the Forum such as democracy, violence, respect for differences. It is worth mentioning that the opening session was attended by a trans male, also contributing to the debates on masculinities.
We consider that the current challenges of feminisms and women's movements are not only related to women themselves. It is from this understanding that we integrate the actions and reflections with/on men and masculinities, such as the articulation of black women, with which we have dialogued and shared patterns of claims in the field of health, when we brought to the fore the genocide of the young population, especially of men, black people and the poor. Our interventions were guided by narratives about an itinerary of collective works that have already completed almost 20 years, during which we gained learning and experienced political, ethical and conceptual deadlocks.
This course begins in Brazil and other Latin American countries, especially since the 1990s55. Aguayo F, Nascimento M. Dos décadas de Estudios de Hombres y Masculinidades en América Latina: avances y desafíos. Sexualidad, Salud y Sociedad [Internet] 2016. [citado 2016 Out 25]; 22 (1). Disponível em: http://www.redalyc.org/pdf/2933/293345349009.pdf.
http://www.redalyc.org/pdf/2933/29334534... , when some men and women, civil society organizations and research groups decide to work directly with male populations, facing the challenge of working with men, from a feminist or gender perspective. The best way we found to talk about this itinerary was to share concerns, especially considering the current Brazilian political moment (with similar reverberations and dynamics in other countries of the region), which encourages us to talk about "masculinities in times of sexist and patriarchal coup", inasmuch as, on the one hand, during the process that resulted in the removal of President Dilma Rousseff, there were recurrent references to sexist arguments, with a view to her moral disqualification, a game that began in the 2014 election campaign and extended after her departure from the Presidency. On the other hand, this trend is confirmed by the composition of a male-only ministry and a clear rejection of the feminist agenda by the current government assumed by former Vice President Michel Temer and his team.
Thus, we emphasize that the realization of this event occurred at a sad moment in Brazilian political history, which has certainly produced impacts on the lives of real women and men, but also in the symbolic and cultural forms from which we produce femininities and masculinities, making us face again the challenges that perhaps seemed to have already been overcome. We are living in difficult times, when setbacks threaten the young Brazilian democracy and produce lasting repercussions on the field of feminist studies and interventions in Brazil and other countries. After all, critical situations of this nature have occurred in several other countries, as discussed in the opening session, mediated by Sonia Correa, co-coordinator of the ABIA Sexuality and Policy Observatory (SPW). The impact of this scenario on the field of political studies and interventions on men and masculinities, which take feminism as a theoretical and ethical-political framework, is of great concern to us.
Thus, we seek from the speech of each one to bring elements to the debate about working with men from feminist readings, anchored in our actions as activists and researchers, and close dialogue with public policies. We also seek, through specific selections of our performance, to provide the participants with a broad view on deadlocks, but also possibilities within the contemporary context. In general terms, we emphasize that the transformation of gender relationships to the promotion of social justice, with equality and democracy, is, among other possible alternatives, a result of education in sexuality, as long as it recognizes the need for reflection on naturalization processes about social places of men and women and respect for differences.
Unfortunately, we have witnessed, in different countries, the development of a project to dismantle the course undertaken since the end of the 1990s, regarding sexuality education, assumed in the Brazilian context by collaboration between the health and education sectors, besides the strong presence of civil society organizations. Contrary to human rights, fundamentalist debates that disregard the theoretical-epistemological consistency of the field of gender studies insist on fallacies such as "gender ideology" and are taking shape in different Latin American countries. The adoption of this terminology by conversational sectors, especially of a Christian religious nature, reveals a space of tensions and disputes in which social respect for gender diversity and sexual orientation and the ideal of equality between men and women is at stake.
Thus, the proposal to censor sexuality education in schools (camouflaged in the expression "school without a party"), criticism of the use of educational materials related to coping with homophobia (pejoratively called "gay kit"), persecution of the "gender" term in public education plans exemplify only few initiatives that have gained the headlines, political disputes, and recent election campaigns across the country66. Carrara S. Moralidades, racionalidades e políticas sexuais no Brasil contemporâneo. Mana [online] 2015; 21(2):323-345. [citado 2017 Jan 11]. Disponível em: http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0104-93132015000200323&lng=en&nrm=iso
http://www.scielo.br/scielo.php?script=s... . In this fundamentalist thinking, the possible equality between men and women becomes a danger to the maintenance of the current status quo based on gender asymmetry and hierarchy. Recognizing the dismantling of sexuality education in the current Brazilian context means pointing to the urgent need to establish a position of struggle in favor of secularity, equity and equality between men and women, from a feminist and gender perspective.
Similarly, we must alert to resistance to the recognition of women in politically representative spaces, which has been growing in recent years, as well as a complex web that links the field of politics to ancient patriarchal traditions. In Brazil, by assuming the possibility of a woman in the highest position of national political representation, we witness resistance from a variety of sources, from the refusal to use the term "President", to car stickers that illustrate Presidential rape, "Ill-judged" to Dilma, in the electoral campaign; people shouting "Dilma, fuck you!" in a World Cup opening event, phallic jokes from the President's public speech slips and the fateful episode "Beautiful, discrete and housewife" (an allusion to supposedly journalistic material about the wife of the current President). Excerpts from the speeches of some federal deputies in favor of the opening of the President's impeachment process (on 17/04/2016) published in the Congress portal) illustrate old traditions in the shape of formal politics: "For my family! My children, Estevão, Amanda, my wife, my parents […]"; "For my family, for the good people"; "For my granddaughter who is celebrating her birthday"; "For my sons Bruno and Felipe"; "For my daughter Manoela who is going to be born"; "For Sandra, for Erica, for Vítor, for Jorge, and for my grandson who is coming"; "For the honor of my father who has held this chair twice".
Despite our position on the government in question and the legitimacy of the coup disguised as impeachment, whose effects are already felt, the statements that accompanied the vote of the congressmen (mostly men) regarding the implementation of the process of impeachment of President Dilma Rousseff (the first woman elected democratically in Brazil) and the establishment of the ministries by the coup government (exclusively composed of men, whites, rich and supposedly heterosexual) made clear that we still have much to learn and much more is yet to change in the field of gender relationships, both from the symbolic viewpoint and in the various forms of socialization and institutionalization of power, which favor the supremacy of hegemonic masculinity77. Connell R. Masculinities. Berkeley: University of California Press; 1995..
The speeches of parliamentarians and the set of measures taken to reverse important advances in the field of women and the LGBT population (lesbian, gay, bisexual, transgender and transvestite) generally produce figurations88. Medrado, Benedito. Más allá de las representaciones dicotómicas de género y sexualidad: figuraciones al borde de la religión en el Norte de Brasil. Sexualidad, Salud y Sociedad [Internet], 2016. [citado 2016 Out 25]; 22(1). Disponível em: http://www.scielo.br/pdf/sess/n22/1984-6487-sess-22-00301.pdf
http://www.scielo.br/pdf/sess/n22/1984-6... that illustrate strong forms from which the sex-gender system operates in the establishment of masculine power relationships, whether in spaces of intimacy, in the public sphere or the illusory boundaries between both. This process produces diverse modes of oppression over/in subjects and over/in institutions, from the production of perverse truths and ways of subjectivation (and exclusion).
The glorification of the "traditional family" in the speeches of our "representatives" is no mere coincidence. With the exaltation of this intelligible, normal, or basic "family model" (insofar as the others, when recognized, are called "alternative models"), these deputies not only confront parliamentary decorum (in its broadest sense) and zeal for good and public order (which could never be guided by personal interests or honors or extended to their families), but also produce, as an effect, the (re) affirmation of a way of living sexuality (exclusively for reproduction) and an economic model of family arrangement focused on material and symbolic reproduction, markedly sexist and patriarchal, with an oppressive and enslaving basis, in which the patriarch is the central figure.
In the infamous game between private policies and public practices (which breaks with the arbitrary and useful separation between public and private), a clear gap is noted between the accumulation of theoretical and political productions on feminism, gender and sexuality, and the narrow-minded maneuvers in the exercise/maintenance of traditional power practices.
Also, it is worth emphasizing that the thread that stitches this discursive and material plot, which orders power plays, is set by heteropatriarchal postulates that reaffirm the dominant masculine position and function99. Biglia B. Avances dilemas y retos de la epistemología feminista en la investigación social. In: Mendia I, Lúxan M, Egarreta ML, Guzmán G, Zirion I, Azpiazu J, editores. Otras formas de (re)conocer. Bilbao: UPV, Hegoa, SIMReF; 2015. p. 21-44.. Although, as Parry Scott1010. Scott P. O patriarca atacável: simbologia, poder e movimentos no combate à violência contra mulheres. In: Quadros MT, Albernaz LSF, organizadoras. Novos grupos, antigas questões? Gênero, violência contra a mulher e homofobia em contextos rurais e urbanos. Recife: EDUFPE; 2016. p. 18-37. points out, the patriarch is a multiple and changeable figure, sometimes "the incarnation of the oppression of women and the working classes" or "the symbol of national unification for its contribution to the formation of the homeland", those enunciated in the House of Representatives extol the portrait of a patriarchal model of family and gender structure that seemed to us (at least in the realm of desire) very distant in time and space.
It was, at least as we thought, almost 20 years ago, when the book "Men and masculinities: other words"1111. Arilha M, Benedito Medrado SU. Introdução. In: Margareth A, Benedito Medrado SU, organizadores. Homens e Masculinidades: outras palavras. São Paulo: Ecos Editora 34; 1998. p. 15-30. was launched. The setting was different then. As a result of a collective effort that began in 1995, fueled by the stimulating discussions at the 1994 Cairo Conference on Population and Development and the 1995 Beijing International Women's Conference, that group had something in common. They all recognized the historical itinerary and importance of the feminist legacy and the sexual rights movement to the way in which male experiences, symbolic social reassignments about masculinity: […] In seeking to define broadly in public and private spheres their space in politics, economics and issues related to sexuality, women and homosexuals organized themselves to challenge the discrimination they suffered by proposing other mentalities, behaviors and perspectives, "other words" for intergender relationships, questioning above all the hegemonic masculinity: white, heterosexual and dominant. At the time, we were thinking about the effects of shifts produced by feminism on men and the symbolic order of masculinity. Such shifts derived mainly from the achievements of the women's and LGBT movements, who claimed, in a more or less direct way, a symbolic resignification of masculinity.
Challenges are certainly different today, marked by a less optimistic and more worrying scenario. We must work from cartographies of controversies, as the actor-network theory invites us1111. Arilha M, Benedito Medrado SU. Introdução. In: Margareth A, Benedito Medrado SU, organizadores. Homens e Masculinidades: outras palavras. São Paulo: Ecos Editora 34; 1998. p. 15-30., for if, on the one hand, men and masculinities are diverse – apart from sex and sexuality (often considered as binaries) and men are "affected" by sexist and patriarchal models (since the main causes of death for men are external, such as violence and road traffic accidents), on the other hand, places of power and violence are led by men (men are the ones killing the most) and economic and political exploitation methods are largely orchestrated by men and based on patriarchal and sexist models of relationship.
In general, our experience at the AWID Forum reinforces our convictions that structural changes stem from the involvement of men (1980s), but we must go further, and that masculinity organizing ways are not only in the bodies of men but are reproduced in institutions and symbols. Finally, in the play of these challenging controversies, we hope that the reflections produced at this meeting can help us produce creative theoretical tools to understand the current political landscape and to continue to project "other words" to continue to feed our utopia for a better world, with social justice and gender equity.
AWID International Forum. Co-Creating Feminist Realities [acessado 2016 Out 25]. Disponível em: http://www.forum.awid.org/forum16/
» http://www.forum.awid.org/forum16/
Diniz D. Zika: do sertão nordestino à ameaça global Rio de Janeiro: Civilização Brasileira; 2016.
Pitanguy J. Os direitos reprodutivos das mulheres e a epidemia do Zika vírus. Cad Saúde Pública [Internet]. 2016 [citado 2016 Out 25]; 32(5). Disponível em: http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0102-311X2016000500603&lng=pt
» http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0102-311X2016000500603&lng=pt
Galli B, Deslandes S. Threats of retrocession in sexual and reproductive health policies in Brazil during the Zika epidemic. Cad Saúde Pública [Internet]. 2016 [citado 2016 Out 26]; 32(4):e00031116. Disponível em: http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0102-311X2016000400301&lng=pt
Aguayo F, Nascimento M. Dos décadas de Estudios de Hombres y Masculinidades en América Latina: avances y desafíos. Sexualidad, Salud y Sociedad [Internet] 2016. [citado 2016 Out 25]; 22 (1). Disponível em: http://www.redalyc.org/pdf/2933/293345349009.pdf
» http://www.redalyc.org/pdf/2933/293345349009.pdf
Carrara S. Moralidades, racionalidades e políticas sexuais no Brasil contemporâneo. Mana [online] 2015; 21(2):323-345. [citado 2017 Jan 11]. Disponível em: http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0104-93132015000200323&lng=en&nrm=iso
» http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0104-93132015000200323&lng=en&nrm=iso
Connell R. Masculinities Berkeley: University of California Press; 1995.
Medrado, Benedito. Más allá de las representaciones dicotómicas de género y sexualidad: figuraciones al borde de la religión en el Norte de Brasil. Sexualidad, Salud y Sociedad [Internet], 2016. [citado 2016 Out 25]; 22(1). Disponível em: http://www.scielo.br/pdf/sess/n22/1984-6487-sess-22-00301.pdf
» http://www.scielo.br/pdf/sess/n22/1984-6487-sess-22-00301.pdf
Biglia B. Avances dilemas y retos de la epistemología feminista en la investigación social. In: Mendia I, Lúxan M, Egarreta ML, Guzmán G, Zirion I, Azpiazu J, editores. Otras formas de (re)conocer Bilbao: UPV, Hegoa, SIMReF; 2015. p. 21-44.
Scott P. O patriarca atacável: simbologia, poder e movimentos no combate à violência contra mulheres. In: Quadros MT, Albernaz LSF, organizadoras. Novos grupos, antigas questões? Gênero, violência contra a mulher e homofobia em contextos rurais e urbanos Recife: EDUFPE; 2016. p. 18-37.
Arilha M, Benedito Medrado SU. Introdução. In: Margareth A, Benedito Medrado SU, organizadores. Homens e Masculinidades: outras palavras São Paulo: Ecos Editora 34; 1998. p. 15-30.
Venturini T. Diving in Magma: how to explore controversies with actor network theory. Public Understanding of Science [Internet]. 2016 [citado 2016 Out 25]; 19(3). Disponível em: http://pus.sagepub.com
» http://pus.sagepub.com
B Medrado, M Nascimento and J Lyra equally collaborated in the design, elaboration, writing and review of this paper.
Os feminismos e os homens no contexto brasileiro: provocações a partir do encontro 13º Fórum Internacional AWID


4 points shall be awarded for each match. Teams shall receive 1 point for each win. No points shall be awarded for a loss. Results of matches must be notified to the League Organiser by the winning team within 48 hours.


Tax evasion has become a common practice for enterprises and institutions in Mainland China. In addition to the financial aspect, transplant centers also maintain two sets of books when it comes to transplant volume.
In the industry's early period of growth after 2000, because transplant volume was limited by technology and the cost of immunosuppressant medications, hospitals and doctors engaged in high-profile publicity to attract patients. Transplant volumes increased with the quick resolution of these obstacles. For self-financed hospitals, protecting themselves from the tax consequences of this surge in profits became a practical concern. Underreporting of transplant volumes became a way to evade taxation.
As mentioned earlier, the Oriental Organ Transplant Center performs thousands of transplants per year but reported only 7 liver transplants to the National Liver Transplant Registry in 2010.
In other words, as of 2014, Peking University People's Hospital has publicly reported that is has performed fewer than 1,200 liver and kidney transplants in over a decade.
Zhu was describing events before 2010. The hospital's transplant center moved into its new 470-bed surgery building in December 2005. Its website now claims it performs 120 to 130 liver and kidney transplants per year,4 a mere 1/33rd of the number stated by Zhu Jiye. It is unlikely that a transplant center with 470 beds would perform only 120 to 130 surgeries per year.
"Wu Mengchao: Medical Ethics Are More Important Than Techniques; It Is Most Important for Doctors to Learn to Be Human"
"Expert: organs from death-row prisoners sources reduce will increase patients waiting for treatment"
"Peking University People's Hospital, Kidney transplantation, July 16, 2014"
"Military doctor reveal the CCP stealing and selling organs of Falun Gong EpochTimes April 30, 2006"


text:
Apr 15, 2021 - World
Blinken makes unannounced trip to Afghanistan to sell troop withdrawal
Fadel Allassan
Photo: CARLOS BARRIA/POOL/AFP via Getty Images
Secretary of State Antony Blinken made an unannounced trip to Afghanistan on Thursday to meet with the nation's president, Ashraf Ghani, and Abdullah Abdullah, who is representing the Taliban in negotiations, per the Washington Post.
Why it matters: Blinken sought to reassure the pair that the U.S. will maintain support for the country, despite President Biden's decision to withdraw troops from Afghanistan starting May 1 and concluding in full by Sept. 11.
Driving the news: Blinken told Ghani at the presidential palace in Kabul he "wanted to demonstrate with my visit the ongoing to commitment of the United States to the Islamic Republic and the people of Afghanistan," per the Post. "The partnership is changing, but the partnership itself is enduring," Blinken said.
Ghani told Blinken: "We respect the decision and are adjusting our priorities."
The U.S. secretary of state told Abdullah their respective parties "have a new chapter, but it is a new chapter that we're writing together." Abdullah said he was grateful for the American people and administration.
Worth noting: The sudden meeting comes after Blinken met with NATO Secretary-General Jens Stoltenberg, who announced the alliance's forces would also leave.
Go deeper: CIA director says Afghanistan withdrawal poses "significant risk" of terrorist resurgence

redpajama_set_name: RedPajamaCommonCrawl


Here at the Hotel Glacier in Grindelwald, the Bernese Alps feel close enough to reach out and touch. Our 4-star boutique hotel keeps things personal, with just 28 rooms and suites striking the perfect balance between home-style comfort and one-of-a-kind alpine design. Since reopening in spring 2018, following a complete revamp, we've welcomed guests from all over the world to this astoundingly beautiful corner of the Jungfrau Region.
Looking back on 150 years of history, our name alludes to the Lower Grindelwald Glacier that once reached all the way to the valley. Now the hotel shines once again with a fresh-faced sustainable design that reveals a love of the ice and mountains found right on our doorstep. One glimpse of Eiger North Face through your window and you'll be itching to head outdoors and hit the heights.
Book your stay directly with us for the best available rates and warmest of welcomes.
Inspired by the love for exquisite ingredients. We created a menu with produce grown in our own gardens or sourced as locally as possible. Almost all our dishes start with homemade base-products and are adapted to the seasons. Several dishes include preparation steps like fermentation, smoking or dry-ageing. These processes take often more than a month and only then the kitchen team can start their magic.
We take social responsibility very seriously and this shows in every aspect of our approach towards our guests, partners, employees and the environment. At Hotel Glacier, we genuinely care about giving something back to the beautiful mountains and communities that surround us, while staying true to the rich culture and history that make us what we are.
Here at Hotel Glacier, we've kept the cosy mountain vibe while winging our way into the 21st century, with unique interiors and fun-loving features that bring the outdoors in. Our team will ensure that each and every stay is wholly memorable – nothing is too much trouble. From the classic twin room to the decadent honeymoon suite, you'll feel right at home with all-natural COCO-MAT® beds, Ayurveda-inspired Rituals® toiletries, an iPad pre-loaded with info on the region, and fast and free wi-fi.
Book your stay directly with us for get the best rates.
Get the most of your stay with Hotel Glacier's offers, reaching from honeymoon packages to discounted rates.
Whether you're here for a one-night stopover or a longer stay in the region, we can help you tailor your own adventure. For weddings or group stays, please contact us directly.


text:
#include "hr_in_resource.h"
#include "hedgerender/gfx/hr_resource.h"
#include "hedgerender/gfx/hr_render_device.h"

namespace hr
{
namespace gfx
{
in_vulkan_format_info::in_vulkan_format_info(VkFormat vkFormat)
{
    switch (vkFormat)
    {
    case VK_FORMAT_R8_UNORM:
    case VK_FORMAT_R8_SNORM:
    case VK_FORMAT_R8_UINT:
    case VK_FORMAT_R8_SINT:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 8;
        break;

    case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 12;
        break;

    case VK_FORMAT_R5G6B5_UNORM_PACK16:
    case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
    case VK_FORMAT_R8G8_UNORM:
    case VK_FORMAT_R8G8_SNORM:
    case VK_FORMAT_R8G8_UINT:
    case VK_FORMAT_R8G8_SINT:
    case VK_FORMAT_R16_UNORM:
    case VK_FORMAT_R16_SNORM:
    case VK_FORMAT_R16_UINT:
    case VK_FORMAT_R16_SINT:
    case VK_FORMAT_R16_SFLOAT:
    case VK_FORMAT_D16_UNORM:
    case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 16;
        break;

    case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
    case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 24;
        break;

    case VK_FORMAT_R8G8B8A8_UNORM:
    case VK_FORMAT_R8G8B8A8_SNORM:
    case VK_FORMAT_R8G8B8A8_UINT:
    case VK_FORMAT_R8G8B8A8_SINT:
    case VK_FORMAT_R8G8B8A8_SRGB:
    case VK_FORMAT_B8G8R8A8_UNORM:
    case VK_FORMAT_B8G8R8A8_SRGB:
    case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
    case VK_FORMAT_A2B10G10R10_UINT_PACK32:
    case VK_FORMAT_R16G16_UNORM:
    case VK_FORMAT_R16G16_SNORM:
    case VK_FORMAT_R16G16_UINT:
    case VK_FORMAT_R16G16_SINT:
    case VK_FORMAT_R16G16_SFLOAT:
    case VK_FORMAT_R32_UINT:
    case VK_FORMAT_R32_SINT:
    case VK_FORMAT_R32_SFLOAT:
    case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
    case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
    case VK_FORMAT_D32_SFLOAT:
    case VK_FORMAT_D24_UNORM_S8_UINT:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 32;
        break;

    case VK_FORMAT_R16G16B16A16_UNORM:
    case VK_FORMAT_R16G16B16A16_SNORM:
    case VK_FORMAT_R16G16B16A16_UINT:
    case VK_FORMAT_R16G16B16A16_SINT:
    case VK_FORMAT_R16G16B16A16_SFLOAT:
    case VK_FORMAT_R32G32_UINT:
    case VK_FORMAT_R32G32_SINT:
    case VK_FORMAT_R32G32_SFLOAT:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 64;
        break;

    case VK_FORMAT_R32G32B32_UINT:
    case VK_FORMAT_R32G32B32_SINT:
    case VK_FORMAT_R32G32B32_SFLOAT:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 96;
        break;

    case VK_FORMAT_R32G32B32A32_UINT:
    case VK_FORMAT_R32G32B32A32_SINT:
    case VK_FORMAT_R32G32B32A32_SFLOAT:
        type = in_vulkan_format_type::standard;
        bitsPerPixel = 128;
        break;

    case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
    case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
    case VK_FORMAT_BC4_UNORM_BLOCK:
    case VK_FORMAT_BC4_SNORM_BLOCK:
        type = in_vulkan_format_type::block_compressed;
        blockSize = 8;
        break;

    case VK_FORMAT_BC2_UNORM_BLOCK:
    case VK_FORMAT_BC2_SRGB_BLOCK:
    case VK_FORMAT_BC3_UNORM_BLOCK:
    case VK_FORMAT_BC3_SRGB_BLOCK:
    case VK_FORMAT_BC5_UNORM_BLOCK:
    case VK_FORMAT_BC5_SNORM_BLOCK:
    case VK_FORMAT_BC6H_UFLOAT_BLOCK:
    case VK_FORMAT_BC6H_SFLOAT_BLOCK:
    case VK_FORMAT_BC7_UNORM_BLOCK:
    case VK_FORMAT_BC7_SRGB_BLOCK:
        type = in_vulkan_format_type::block_compressed;
        blockSize = 16;
        break;

    case VK_FORMAT_G8B8G8R8_422_UNORM:
    case VK_FORMAT_B8G8R8G8_422_UNORM:
        type = in_vulkan_format_type::packed;
        elemSize = 4;
        break;

    case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
    case VK_FORMAT_G16B16G16R16_422_UNORM:
        type = in_vulkan_format_type::packed;
        elemSize = 8;
        break;

    default:
        throw std::runtime_error("Unknown or unsupported image format");
    }
}

std::size_t in_vulkan_format_info::get_bytes_per_mip_level(
    const VkExtent3D& vkExtent) const noexcept
{
    // Compute size for block compressed data.
    if (type == in_vulkan_format_type::block_compressed)
    {
        const std::size_t numBlocksWide = std::max<std::size_t>(
            1, ((static_cast<std::size_t>(vkExtent.width) + 3) / 4));

        const std::size_t numBlocksHigh = std::max<std::size_t>(
            1, ((static_cast<std::size_t>(vkExtent.height) + 3) / 4));

        return (((numBlocksWide * numBlocksHigh) * blockSize) * vkExtent.depth);
    }

    // Compute size for packed data.
    else if (type == in_vulkan_format_type::packed)
    {
        const std::size_t bytesPerRow = ((static_cast<std::size_t>(
            vkExtent.width) + 1) >> 1) * elemSize;

        return ((bytesPerRow * vkExtent.height) * vkExtent.depth);
    }

    // Compute size for standard data.
    else
    {
        const std::size_t bytesPerRow = ((vkExtent.width *
            bitsPerPixel) + 7) / 8;

        return ((bytesPerRow * vkExtent.height) * vkExtent.depth);
    }
}

void in_vulkan_get_next_mip_extent(VkExtent3D& vkExtent) noexcept
{
    vkExtent.width /= 2;
    vkExtent.height /= 2;
    vkExtent.depth /= 2;

    if (vkExtent.width == 0) vkExtent.width = 1;
    if (vkExtent.height == 0) vkExtent.height = 1;
    if (vkExtent.depth == 0) vkExtent.depth = 1;
}

static VmaMemoryUsage in_vulkan_to_vma_memory_usage(
    const memory_type memType) noexcept
{
    return (memType == memory_type::transient) ?
        VMA_MEMORY_USAGE_GPU_ONLY :
        static_cast<VmaMemoryUsage>(memType);
}

static VkMemoryPropertyFlags in_vulkan_get_memory_prop_flags(
    const memory_type memType) noexcept
{
    return (memType == memory_type::transient) ?
        VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT : 0;
}

void* buffer::map()
{
    void* mappedData;
    if (vmaMapMemory(m_vmaAllocator, m_vmaAlloc, &mappedData) != VK_SUCCESS)
    {
        throw std::runtime_error("Failed to map Vulkan buffer");
    }

    return mappedData;
}

void buffer::unmap()
{
    vmaUnmapMemory(m_vmaAllocator, m_vmaAlloc);
}

void buffer::destroy() noexcept
{
    if (!m_vmaAllocator) return;
    vmaDestroyBuffer(m_vmaAllocator, m_vkBuffer, m_vmaAlloc);
}

buffer& buffer::operator=(buffer&& other) noexcept
{
    if (&other != this)
    {
        destroy();

        m_vmaAllocator = other.m_vmaAllocator;
        m_vkBuffer = other.m_vkBuffer;
        m_vmaAlloc = other.m_vmaAlloc;
        m_size = other.m_size;

        other.m_vmaAllocator = nullptr;
    }

    return *this;
}

buffer::buffer(res_allocator& allocator, memory_type memType,
    VkBufferUsageFlags vkBufUsage, std::size_t size,
    void** mappedData) :
    m_vmaAllocator(allocator.handle()),
    m_size(size)
{
    // Generate Vulkan buffer create info.
    const VkBufferCreateInfo vkBufCreateInfo =
    {
        VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,                           // sType
        nullptr,                                                        // pNext
        0,                                                              // flags
        size,                                                           // size
        vkBufUsage,                                                     // usage
        VK_SHARING_MODE_EXCLUSIVE,                                      // sharingMode
        0,                                                              // queueFamilyIndexCount
        nullptr                                                         // pQueueFamilyIndices
    };

    // Generate VMA allocation create info.
    const VmaAllocationCreateInfo vmaAllocCreateInfo =
    {
        static_cast<VmaAllocationCreateFlags>((mappedData) ?            // flags
            VMA_ALLOCATION_CREATE_MAPPED_BIT : 0),

        in_vulkan_to_vma_memory_usage(memType),                         // usage
        0,                                                              // requiredFlags
        in_vulkan_get_memory_prop_flags(memType),                       // preferredFlags
        0,                                                              // memoryTypeBits
        VK_NULL_HANDLE,                                                 // pool
        nullptr,                                                        // pUserData
        0                                                               // priority
    };

    // Create Vulkan buffer using VMA.
    VmaAllocationInfo vmaAllocInfo;
    if (vmaCreateBuffer(m_vmaAllocator, &vkBufCreateInfo,
        &vmaAllocCreateInfo, &m_vkBuffer, &m_vmaAlloc,
        &vmaAllocInfo) != VK_SUCCESS)
    {
        throw std::runtime_error("Could not create Vulkan buffer");
    }

    // Return mapped data pointer if requested.
    if (mappedData)
    {
        *mappedData = vmaAllocInfo.pMappedData;
    }
}

buffer::buffer(render_device& device, memory_type memType,
    VkBufferUsageFlags vkBufUsage, std::size_t size,
    void** mappedData) :
    buffer(device.allocator(), memType, vkBufUsage, size, mappedData) {}

buffer::buffer(buffer&& other) noexcept :
    m_vmaAllocator(other.m_vmaAllocator),
    m_vkBuffer(other.m_vkBuffer),
    m_vmaAlloc(other.m_vmaAlloc),
    m_size(other.m_size)
{
    other.m_vmaAllocator = nullptr;
}

void image::destroy() noexcept
{
    if (!m_vmaAllocator) return;
    vmaDestroyImage(m_vmaAllocator, m_vkImage, m_vmaAlloc);
}

image& image::operator=(image&& other) noexcept
{
    if (&other != this)
    {
        destroy();

        m_vmaAllocator = other.m_vmaAllocator;
        m_vkImage = other.m_vkImage;
        m_vmaAlloc = other.m_vmaAlloc;
        m_size = other.m_size;
        m_vkImageType = other.m_vkImageType;
        m_vkFormat = other.m_vkFormat;
        m_vkExtent = std::move(other.m_vkExtent);
        m_mipLevels = other.m_mipLevels;
        m_layerCount = other.m_layerCount;

        other.m_vmaAllocator = nullptr;
    }

    return *this;
}

static std::size_t in_vulkan_compute_image_size(VkFormat vkFormat,
    unsigned int width, unsigned int height, unsigned int depth,
    unsigned int mipLevels, unsigned int layerCount)
{
    // Validate arguments.
    assert(width > 0 && "Image width must be greater than 0");
    assert(height > 0 && "Image height must be greater than 0");
    assert(depth > 0 && "Image depth must be greater than 0");
    assert(mipLevels > 0 && "Image mip levels must be greater than 0");
    assert(layerCount > 0 && "Image layer count must be greater than 0");

    // Get format info.
    const in_vulkan_format_info fmtInfo(vkFormat);

    // Compute image size.
    std::size_t imageSize = 0;
    while (layerCount--)
    {
        unsigned int layerMipLevels = mipLevels;
        VkExtent3D vkExtent = { width, height, depth };

        while (layerMipLevels--)
        {
            imageSize += fmtInfo.get_bytes_per_mip_level(vkExtent);
            in_vulkan_get_next_mip_extent(vkExtent);
        }
    }

    return imageSize;
}

static VkImageCreateFlags in_vulkan_get_image_create_flags(
    VkImageType vkImageType, unsigned int layerCount) noexcept
{
    VkImageCreateFlags vkImageCreateFlags = 0;
    if (vkImageType == VK_IMAGE_TYPE_2D)
    {
        /*if (layerCount > 1)
        {
            vkImageCreateFlags |= VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT;
        }*/

        if (layerCount >= 6)
        {
            vkImageCreateFlags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
        }
    }

    return vkImageCreateFlags;
}

// NOTE: Defined in hr_render_device.cpp
void in_vulkan_set_debug_name(VkDevice vkDevice,
    VkObjectType vkObjectType, uint64_t vkObjectHandle,
    const char* name);

image::image(res_allocator& allocator, memory_type memType, VkImageType vkImageType,
    VkImageUsageFlags vkImageUsage, VkFormat vkFormat, unsigned int width,
    unsigned int height, unsigned int depth, unsigned int mipLevels,
    unsigned int layerCount, const char* debugName) :

    m_vmaAllocator(allocator.handle()),
    m_size(in_vulkan_compute_image_size(vkFormat, width,
        height, depth, mipLevels, layerCount)),

    m_vkImageType(vkImageType),
    m_vkFormat(vkFormat),
    m_vkExtent({ width, height, depth }),
    m_mipLevels(mipLevels),
    m_layerCount(layerCount)
{
    /*const uint32_t vkQueueFamilyIndices[] =
    {
        inDevice.vkQueueFamilies.graphics_family(),
        inDevice.vkQueueFamilies.copy_family()
    };*/

    // Generate Vulkan image create info.
    const VkImageCreateInfo vkImageCreateInfo =
    {
        VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                            // sType
        nullptr,                                                        // pNext
        in_vulkan_get_image_create_flags(vkImageType, layerCount),      // flags
        vkImageType,                                                    // imageType
        vkFormat,                                                       // format

        {                                                               // extent
            static_cast<uint32_t>(width),                               //  width
            static_cast<uint32_t>(height),                              //  height
            static_cast<uint32_t>(depth)                                //  depth
        },

        static_cast<uint32_t>(mipLevels),                               // mipLevels
        static_cast<uint32_t>(layerCount),                              // arrayLayers
        VK_SAMPLE_COUNT_1_BIT,                                          // samples
        VK_IMAGE_TILING_OPTIMAL,                                        // tiling
        vkImageUsage,                                                   // usage
        VK_SHARING_MODE_EXCLUSIVE,                                      // sharingMode
        0,                                                              // queueFamilyIndexCount
        nullptr,                                                        // pQueueFamilyIndices
        VK_IMAGE_LAYOUT_UNDEFINED                                       // initialLayout
    };

    // Generate VMA allocation create info.
    const VmaAllocationCreateInfo vmaAllocCreateInfo =
    {
        0,                                                              // flags
        in_vulkan_to_vma_memory_usage(memType),                         // usage
        0,                                                              // requiredFlags
        in_vulkan_get_memory_prop_flags(memType),                       // preferredFlags
        0,                                                              // memoryTypeBits
        VK_NULL_HANDLE,                                                 // pool
        nullptr,                                                        // pUserData
        0                                                               // priority
    };

    // Create Vulkan image using VMA.
    if (vmaCreateImage(m_vmaAllocator, &vkImageCreateInfo,
        &vmaAllocCreateInfo, &m_vkImage, &m_vmaAlloc,
        nullptr) != VK_SUCCESS)
    {
        throw std::runtime_error("Could not create Vulkan image");
    }

    // Set debug name if one was provided.
    if (debugName)
    {
        try
        {
            VmaAllocatorInfo vmaAllocatorInfo;
            vmaGetAllocatorInfo(allocator.handle(), &vmaAllocatorInfo);

            in_vulkan_set_debug_name(vmaAllocatorInfo.device,
                VK_OBJECT_TYPE_IMAGE, reinterpret_cast<uint64_t>(m_vkImage),
                debugName);
        }
        catch (...)
        {
            vmaDestroyImage(allocator.handle(), m_vkImage, nullptr);
            throw;
        }
    }
}

image::image(render_device& device, memory_type memType, VkImageType vkImageType,
    VkImageUsageFlags vkImageUsage, VkFormat vkFormat, unsigned int width,
    unsigned int height, unsigned int depth, unsigned int mipLevels,
    unsigned int layerCount, const char* debugName) :
    image(device.allocator(), memType, vkImageType, vkImageUsage, vkFormat,
        width, height, depth, mipLevels, layerCount, debugName) {}

image::image(image&& other) noexcept :
    m_vmaAllocator(other.m_vmaAllocator),
    m_vkImage(other.m_vkImage),
    m_vmaAlloc(other.m_vmaAlloc),
    m_size(other.m_size),
    m_vkImageType(other.m_vkImageType),
    m_vkFormat(other.m_vkFormat),
    m_vkExtent(std::move(other.m_vkExtent)),
    m_mipLevels(other.m_mipLevels),
    m_layerCount(other.m_layerCount)
{
    other.m_vmaAllocator = nullptr;
}

void image_view::destroy() noexcept
{
    if (!m_vkDevice) return;
    vkDestroyImageView(m_vkDevice, m_vkImageView, nullptr);
}

image_view& image_view::operator=(image_view&& other) noexcept
{
    if (&other != this)
    {
        destroy();

        m_vkDevice = other.m_vkDevice;
        m_vkImageView = other.m_vkImageView;

        other.m_vkDevice = VK_NULL_HANDLE;
    }

    return *this;
}

static VkImageAspectFlags in_vulkan_get_image_aspect(VkFormat vkFormat) noexcept
{
    switch (vkFormat)
    {
    case VK_FORMAT_D16_UNORM:
    case VK_FORMAT_X8_D24_UNORM_PACK32:
    case VK_FORMAT_D32_SFLOAT:
    case VK_FORMAT_D16_UNORM_S8_UINT:
    case VK_FORMAT_D24_UNORM_S8_UINT:
    case VK_FORMAT_D32_SFLOAT_S8_UINT:
        return VK_IMAGE_ASPECT_DEPTH_BIT;

    default:
        return VK_IMAGE_ASPECT_COLOR_BIT;
    }
}

static VkImageView in_vulkan_create_image_view(VkDevice vkDevice,
    image& image, VkImageViewType viewType)
{
    const VkImageViewCreateInfo vkImageViewCreateInfo =
    {
        VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,                       // sType
        nullptr,                                                        // pNext
        0,                                                              // flags
        image.handle(),                                                 // image
        viewType,                                                       // viewType
        image.format(),                                                 // format

        {                                                               // components
            VK_COMPONENT_SWIZZLE_IDENTITY,                              //  r
            VK_COMPONENT_SWIZZLE_IDENTITY,                              //  g
            VK_COMPONENT_SWIZZLE_IDENTITY,                              //  b
            VK_COMPONENT_SWIZZLE_IDENTITY                               //  a
        },

        {                                                               // subresourceRange
            in_vulkan_get_image_aspect(image.format()),                 //  aspectMask
            0,                                                          //  baseMipLevel
            image.mip_levels(),                                         //  levelCount
            0,                                                          //  baseArrayLayer
            image.layer_count()                                         //  layerCount
        }
    };

    VkImageView vkImageView;
    if (vkCreateImageView(vkDevice, &vkImageViewCreateInfo,
        nullptr, &vkImageView) != VK_SUCCESS)
    {
        throw std::runtime_error("Could not create Vulkan image view");
    }

    return vkImageView;
}

image_view::image_view(render_device& device, image& image, VkImageViewType viewType) :
    m_vkDevice(device.handle()),
    m_vkImageView(in_vulkan_create_image_view(m_vkDevice, image, viewType)) {}

static VkImageViewType in_vulkan_get_image_view_type(const image& image) noexcept
{
    // TODO: Is all of this correct?
    // TODO: What about VK_IMAGE_VIEW_TYPE_CUBE_ARRAY?

    switch (image.type())
    {
    case VK_IMAGE_TYPE_1D:
        return (image.layer_count() > 1) ?
            VK_IMAGE_VIEW_TYPE_1D_ARRAY :
            VK_IMAGE_VIEW_TYPE_1D;

    default:
    case VK_IMAGE_TYPE_2D:
        if (image.layer_count() >= 6)
        {
            return VK_IMAGE_VIEW_TYPE_CUBE;
        }
        else if (image.layer_count() > 1)
        {
            return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
        }

        return VK_IMAGE_VIEW_TYPE_2D;

    case VK_IMAGE_TYPE_3D:
        return VK_IMAGE_VIEW_TYPE_3D;
    }
}

image_view::image_view(render_device& device, image& image) :
    m_vkDevice(device.handle()),
    m_vkImageView(in_vulkan_create_image_view(m_vkDevice,
        image, in_vulkan_get_image_view_type(image))) {}

image_view::image_view(image_view&& other) noexcept :
    m_vkDevice(other.m_vkDevice),
    m_vkImageView(other.m_vkImageView)
{
    other.m_vkDevice = VK_NULL_HANDLE;
}

void sampler::destroy() noexcept
{
    if (!m_vkDevice) return;
    vkDestroySampler(m_vkDevice, m_vkSampler, nullptr);
}

sampler& sampler::operator=(sampler&& other) noexcept
{
    if (&other != this)
    {
        destroy();

        m_vkDevice = other.m_vkDevice;
        m_vkSampler = other.m_vkSampler;

        other.m_vkDevice = VK_NULL_HANDLE;
    }

    return *this;
}

static VkSampler in_vulkan_create_sampler(VkDevice vkDevice, const sampler_desc& desc)
{
    // Generate Vulkan sampler create info.
    const VkSamplerCreateInfo vkSamplerCreateInfo =
    {
        VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,                          // sType
        nullptr,                                                        // pNext
        0,                                                              // flags
        desc.magFilter,                                                 // magFilter
        desc.minFilter,                                                 // minFilter
        desc.mipmapMode,                                                // mipmapMode
        desc.addressModeU,                                              // addressModeU
        desc.addressModeV,                                              // addressModeV
        desc.addressModeW,                                              // addressModeW
        desc.mipLodBias,                                                // mipLodBias
        (desc.anisotropyEnable) ? VK_TRUE : VK_FALSE,                   // anisotropyEnable
        desc.maxAnisotropy,                                             // maxAnisotropy
        (desc.compareEnable) ? VK_TRUE : VK_FALSE,                      // compareEnable
        desc.compareOp,                                                 // compareOp
        desc.minLod,                                                    // minLod
        desc.maxLod,                                                    // maxLod
        desc.borderColor,                                               // borderColor
        (desc.unnormalizedCoordinates) ? VK_TRUE : VK_FALSE             // unnormalizedCoordinates
    };

    // Create Vulkan sampler.
    VkSampler vkSampler;
    if (vkCreateSampler(vkDevice, &vkSamplerCreateInfo, nullptr, &vkSampler) != VK_SUCCESS)
    {
        throw std::runtime_error("Could not create Vulkan sampler");
    }

    return vkSampler;
}

sampler::sampler(render_device& device, const sampler_desc& desc) :
    m_vkDevice(device.handle()),
    m_vkSampler(in_vulkan_create_sampler(m_vkDevice, desc)) {}

sampler::sampler(sampler&& other) noexcept :
    m_vkDevice(other.m_vkDevice),
    m_vkSampler(other.m_vkSampler)
{
    other.m_vkDevice = VK_NULL_HANDLE;
}
} // gfx
} // hr

redpajama_set_name: RedPajamaGithub


text:
Librarian Advisory Board
IFIS Home FSTA Advisory Boards Librarians
FSTA Librarian Advisory Board
FSTA has been providing a valuable service for researchers for over 50 years. Over the past 10 years the scientific information landscape has shifted. Today it is relatively easy to find lots of information, but harder to identify the relevant and reliable research needed to support current scientific endeavours.
Our mission is to fundamentally understand and best serve the information needs of the food community.
We established the FSTA Librarian Advisory Board in 2021 to advise IFIS on how to develop its services to meet this mission. By bringing their insights into current and emerging issues facing academic librarians, Board Members will help advise IFIS about both FSTA and our information literacy initiatives
Innocent Awasom, Associate Librarian (Research, Instruction & Outreach), Texas Tech University, USA
Megan Frost, Life Sciences Librarian, Brigham Young University Library, USA
Andrea C. Kepsel, Health Sciences Educational Technology Librarian, Liaison to the Department of Food Science and Human Nutrition, Michigan State University Libraries, USA
Jessica Page, Associate Professor, Science Liaison Librarian (Veterinary Medicine, Environment and Natural Resources, Animal Science and Food Science & Technology), The Ohio State University Libraries, USA
Necia Parker-Gibson, Professor and Agriculture Librarian, University of Arkansas Libraries, USA
Dr Shamin Renwick, Senior Librarian, School of Education Library, The University of the West Indies, St. Augustine, Trinidad and Tobago
Dr Magdeline Tao Tao Ng, Head of Learning Innovation and Research, NUS Libraries, National University of Singapore, Singapore
Ria Derkx, Information Specialist Collection Development, Faculty Liaison Plant Sciences, Wageningen University & Research, Library, The Netherlands
Suzan Mamabolo, Senior Librarian (Information and Learning Services) Mahikeng Library, North-West University, South Africa
Sally Nalbandian, Head of the Science & Agriculture Library, University Libraries, American University of Beirut, Lebanon
Jackie Skinner, Academic Liaison Librarian (Chemistry, Food & Nutritional Sciences, Pharmacy), University of Reading Library, UK
We are undertaking further recruitment . If you are interested and would like to be considered, please contact Jonathan Griffin.
Want to know more about IFIS?
Discover our history and purpose
Learn about why IFIS was founded back in 1968, our mission, leadership team and trustees, and the partners with whom we work to reach food communities worldwide.


text:
Home/August 2022, Opinions/Ask Not What Your Country Can Do For You
Ask Not What Your Country Can Do For You
By Lex Greene|2022-08-11T00:36:59-04:00August 11th, 2022|
By Lex Greene
The title is the first half of a statement made by President John F. Kennedy (D) at his Inaugural Address on January 20, 1961. The balance of this statement was – "ask what you can do for your country."
That was sixty-one years ago, and my how things have changed since. Today, democrat voters only ask, even demand, what our government (taxpayers) can do for them. They care not about anything else…Freedom, liberty, and justice for all, be damned. Everything is strictly about voting themselves favors from the government, all of it paid for by taxpayers, and they are obviously willing to even use extreme Nazi-style measures to accomplish the darkest of any heart's desires.
This anti-American movement, totally at odds with President Kennedy's call to the people in 1961, was rooted in the USA at least as far back as the early 1900s under the Wilson administration (D) and firmly advanced under FDR (D) between 1933 and 1945. The Marxist ideologies were then adopted by the 60's peacenik crowd while they were high, and supplanted into their children, later raised by the government in government controlled education. Those peaceniks are often called "professor" today.
There are a few of those old peacenik addicts still around, although they are dying fast from COVID vaccine injury these days. But their children are now one of the biggest problems facing our nation, those between 25-45 years old now. These are the children and grandchildren of the 60s global Marxist generation, led by the likes of Che Guevara and the Weather Underground. Today, these groups are now represented by democrat street militants, Black Lives Matter and ANTIFA.
So, after decades of these groups advancing the "what can the taxpayers do for me" agenda, Kennedy's statement changes once again.
Instead of asking what our country can do for us, we must now ask…
WHAT CAN OUR COUNTRY DO TO US?
Americans of every political stripe need look no further than what our government has done to our country just since January 2020, with the Klaus Schwab, Bill Gates, Anthony Fauci, Barack Obama, Joe Biden, and Kamala Harris Nazi regime and their maniacal psychos in every federal agency, including the US Military – via their purely evil GLOBAL COVID19 RESET.
But if that doesn't make the hair raise on the neck of every American, the raid on the home of billionaire former President Trump should have you throwing up in your bathroom by now.
Ahead of that raid, the DOJ and FBI had already run numerous other fraudulent fake investigations working in concert with powerful democrats, trying to take down the most popular political figure on earth today, and everyone who supports him. January 6, 2021 rally goers remain in prison as nothing more than political prisoners today, except the two who have recently committed suicide.
Biden's (Obama's) DOJ and FBI waited for Trump to be out of town, gave the Trump's Secret Service detail only 45-minutes advance notice, demanded that all Trump property security cameras be shut down and denied any Trump lawyers to be present during the raid – after Trump and his lawyers had been voluntarily cooperating with officials for month, which at this point, no citizens should ever do. All of this is unconstitutional, illegal, and never done before.
Within hours we find out that it was none other than former Jeffrey Epstein pedophile lawyer, now Federal Judge Bruce Reinhart, believed to have hastily signed off on the Trump raid warrant…likely a pedophile himself, truth be known.
It's also coming to light that Liz Cheney's husband is at the law firm defending Hunter Biden, which really pertains to Joe Biden's international money laundering schemes, so far buried by the DOJ and FBI.
You just can't make this kind of stuff up! The "swamp" is coming into crystal clear focus.
Now, I have watched as the mindless boobs who believe every lie the leftist politicians and their media ever tell, rage with excitement over what they just saw on their 24/7 anti-Trump TV screen and leftist social media platforms, even openly threatening violence towards the entire nation "if Trump isn't indicted for something," whether he has actually done anything illegal or not.
Part of me gets a real kick out of seeing idiot anti-gun folks openly threatening gun-enthusiasts in broad daylight on public social media. The other part of me knows that if any conservative or republican ever did that, Biden's DOJ and FBI would raid their homes in minutes, as if it were the Trump compound in Florida.
Add to this the knowledge that democrats just rammed through (with no bipartisan support) another $1.3 Trillion spending bill disguised as some inflation reduction act, which includes $80 billion for 87,000 new IRS agents, (a 500% increase) on the heels of spending $700,000 for more IRS weapons and ammo a few weeks earlier, and you'd have to be deaf, dumb, and blind to miss the memo!
I think we can safely say, we get the message loud and clear. Remember what the leftists in power keep telling you? "No one needs weapons of war except the military." – Except of course, Biden's (Obama's) gestapo, once proudly referred to as our US National Security agencies and US Military.
Clearly, the Biden (Obama) regime in power has rapidly and fully weaponized the entire federal authority against the American people…And since no one needs that kind of power unless they are going to war, they are going to war! This time, with us!
Indeed, it's no longer "Ask not what your country can do for you" or "what you can do for your country" or even "what taxpayers can do for Marxist thugs," – it's now, WHAT CAN OUR COUNTRY DO TO US, every American?
Because Americans have been asleep at the wheel for so long and still not ready to make a united stand against tyranny, I suspect we will find out what they can do before November, when democrats are poised to lose political power from sea to sea and border to border.
Think there is anything they are unwilling to do? I don't… Why would you?
© 2022 Lex Greene – All Rights Reserved
E-Mail Lex Greene: NWVLexGreene@gmail.com
About the Author: Lex Greene
Comment to Lex Greene at: NWVLexGreene@gmail.com Lex Greene is a pen name and if you know American history, then you know why this name was chosen. Lex Greene is an avid historian with many years' professional experience in U.S. and World events. He has not written for publication in several years, for the benefit of family and personal protection. Due to today's cancel-culture, a pen name is used by this writer to protect the writer's true identity. Radio FREE Lex Greene 2021 • A podcast on Anchor
Subscribe To Daily Email Alerts
Select list(s) to subscribe to National
Yes, I would like to receive Email Alerts from NewsWithViews.com
By submitting this form, you are consenting to receive marketing emails from: News With Views, P.O. Box 990, Spring Branch, TX, 78070-9998, https://www.newswithviews.com. You can revoke your consent to receive emails at any time by using the SafeUnsubscribe® link, found at the bottom of every email. Emails are serviced by Constant Contact
A Look Behind the GOP's "Dark Path" – It's Just Anti-Globalism, Absent Good Messaging January 28, 2023
Weapons Government Traitors Use: Big Lies, False Flags, and Projection January 28, 2023
Time For The Pundits to Explain the Big Ruse January 27, 2023
Domestic Genocide in Iran January 26, 2023
Governed by Idiots January 26, 2023
Search News With Views
Copyright 2021 All Rights Reserved NEWSWITHVIEWS.COM | Website Services by Myowebdesign.com


text:
Home › NHL › Toronto Maple Leafs Program Cover - Maple Leaf Gardens Syl Apps
Toronto Maple Leafs Program Cover - Maple Leaf Gardens Syl Apps
In the early days, long before cell phones and social media, hockey fans would arrive at their arena anxious to buy the latest game program giving them the latest info they needed to follow their favorite team. The advent of digital design and sophisticated photography has dramatically transformed the look and feel of the classic game-night program that captured the attention of fans. As early as the 1920's, portraits and caricatures captured the scope of what fans would find at the rink. This early Maple Leaf Gardens program cover featured a photo of Syl App. He played for the Toronto Maple Leafs from 1936 to 1948, was an Olympic pole vaulter and a Conservative Member of Provincial Parliament in Ontario. In 2017 Apps was named one of the '100 Greatest NHL Players' in history.


text:
Cuba promotes use of satellite remote scanning and detecting
At the Cuban Convention on Earth Sciences, the country presented "A Look to the Outer Space" which promotes the use of satellite remote scanning and detecting to be used for the country"s economy.
Dr. Manuel Iturralde, president of the Cuban Society of Geology, said that satellite technology has many applications in everyday life and social practice of Cuba. He continued that there are many groups working on issues involving the use of satellite pictures in their research and everyday practice in Cuba, and that is working on the creation of a national remote sensing center, which favors the work between those who work related to this specialty in the country.
According to Prensa Latina the Cuban expert stressed the importance of the use of satellite remote sensing use in areas such as agriculture, as well as in studies of risk prevention of disasters such as floods, drought and earthquakes. That discipline has applications also in meteorology, geology, mineral prospecting, mapping, urban planning, hydrography, oceanography, environmental monitoring, among other areas.
Nearly 1,000 professionals from 29 countries attended the 6th Cuban Earth Sciences Convention under the theme "Geosciences in the service of society and development".


text:
Miami Taxi Driver 2
Drive the taxi across the streets of Miami to pick up passengers and transport them to their respective destinations safely and in quick time.
More car games - Play Them All for Free
Physicar
Army Car Team
London Minicab
Rocky Rider
Earn To Die 2012 Pa..
VXR Racing
Urban Mayhem Truck
Super Battle City
Mario Hit The Road
Theft Super Cars
Freeway Fury 3
Boys and girls love to see beautiful and pimped cars running on the streets or their drivers competing to see who is the best one when it comes to reaching the finish line. The four-wheels vehicles are a good kind of transport, but what the fans are mostly worried about is if they are fast enough when in the middle of a race, for every second counts to try to get the first place. Their design is also very important, because no serious driver wants to have their car looking exactly like the others, originality is something that counts a lot for the vehicles. There are many different types of car, since people have different tastes and therefore racing with pick-ups or monster trucks may sound more fun to a few ones, while others will try to compete in a Formula racing, where the cars are faster and there is always the danger of an accident while turning on the corner. Regular races are famous, but all around the world people are finding new ways of trying their driving skills with other tournament genres like drifting, really famous thanks to the third Fast and Furious movie. They are not used to have fun only, for you might need them if you are a criminal running away from the Police or a cop trying to catch the robber with your patrol vehicle. Cabs and trucks are also available for those who want to try something else and see if they are skilled enough.
Resources: Unity Car Games
phineas and ferb games
spongebob games
tom and jerry games
back in time point and click walkthrough ball game escape puzzle carmel games pretentious game game back in time 2
About GameSnappy.com - Free Online Games! Starting on boards to please the royalty and sometimes even the peasants, games were created to provide fun and entertainment when people didn't have more than their friends or a jester, if they were kings or princes, to entertain them. With time, people though that nobody would play those anymore thanks to new technology like the television. They were wrong, and the video games were the answer, adapting themselves to the new generation. The computer didn't stay behind and that started what brought nowadays the flash gaming to the players' life. They are produced by the hundreds and there are many different genres to be played, like the most famous ones for the boys such as action and strategy, maybe even a football game that is played online. The oldest board ones like chess are still famous, but the adapted versions are important to develop the logic thinking and intelligence from kids to grown ups. Together with the physics gaming, they are perfect to be presented to the kids at school, since they can learn a lot more when there is something interesting in the screen. The girls don't have to worry, for their doll dressing up won't be left aside, with a game for every different taste, from a simple dress up to a complete make over of beautiful girls. To complete the super package, playing with the favorite characters online, such as Spongebob Squarepants or Kim Possible is also a possibility, the perfect combination of fun and entertainment.
Friends of Us: mods ATS - ATS Mods download - ATS mods trucks - American Truck Simulator Mods - ATS mods - Free Games - Basketball Games Online - friv 3 - Friv24 - Friv - Kizi - friv2 - friv - friv games - play friv - Unblocked Games - friv 2015 - juegos friv - friv 100
Copyright © 2019. GameSnappy.com - Free Online Games. All Rights Reserved.